基于TI AM62x的SPI接口配置

2024年03月22日 15:52    发布者:繁花之语
SPI(Serial Peripheral Interface)通信总线以其高速、全双工、同步的特性而被广泛应用,它只需要四根线就能实现数据传输,有效地节约了芯片管脚的数量,同时为PCB布局带来了空间上的优化和便捷。正因为它简单易用的特点,现在越来越多的芯片选择集成SPI通信协议。作为TI Sitara™产品线新一代MPU产品,TI AM62x处理器特别配备了多达4路的SPI接口以及1路OSPI接口(有时也称为QSPI),丰富的SPI接口配置使得该处理器能够同时与多个设备进行通信连接,大大提高了系统的扩展性和灵活性。

01 SPI的工作流程和时序我们首先需要了解一下SPI是如何工作的——通常SPI通过4个引脚与外部器件相连:(1) MISO:主设备输入/从设备输出引脚该引脚在从模式下发送数据,在主模式下接收数据;(2) MOSI:主设备输出/从设备输入引脚该引脚在主模式下发送数据,在从模式下接收数据;(3) CLK:串口时钟作为主设备的输出,从设备的输入;(4) NSS:从设备选择这是一个可选的引脚,用来选择从设备。
SPI的工作流程是这样的:(1) 主机先将NSS信号拉低,这样保证开始接收数据;(2) 当接收端检测到时钟的边沿信号时,将立即读取数据线上的信号,这样就得到了一位数据;(3) 由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度;(4) 主机发送到从机时,主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;(5) 主机接收从机数据时,如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送。
SPI工作时序图如下:
https://img-blog.csdnimg.cn/img_convert/5a063845d487754dafd4fb572c03297f.png
02AM62x处理器中SPI总线的特点在AM62x这款芯片中,TI将SPI的MISO与MOSI设计为d0和d1,具体哪一个作为输入,哪一个作为输出,是由设备树中的 ti,pindir-d0-out-d1-in= <1>来设置的。
默认属性值为0,即d0是输入,d1是输出;当属性值为1时,d0为输出,d1为输入。
03 AM62x的SPI应用1. menuconfig配置:将该项选中,SPI驱动将编译进内核中。makemenuconfiDeviceDrivers ->SPIsupport ->Usermode SPI device driver support(注:在飞凌嵌入式OK6254-C开发板中,SPI驱动编译已进去。)
2. 设备树配置:(1) 选择需要使用的spi,这里我们用spi0,节点为&main_spi0;(2) 将该节点所用的引脚复用为相应的功能。

[*]
spi0_pins_default: spi0-pins-default {    pinctrl-single,pins = <            AM62X_IOPAD(0x1B4, PIN_OUTPUT, 0) /* (A13) SPI0_CS0 */            AM62X_IOPAD(0x1B8, PIN_OUTPUT, 0) /* (C13) SPI0_CS1 */            AM62X_IOPAD(0x1C0, PIN_INPUT, 0) /* (B13) SPI0_D0 */            AM62X_IOPAD(0x1BC, PIN_OUTPUT, 0) /* (A14) SPI0_CLK */            AM62X_IOPAD(0x1C4, PIN_INPUT, 0) /* (B14) SPI0_D1 */        >;    };
(3) 描述节点的属性,具体配置项的功能见注释。
[*]
&main_spi0 {  status = "okay";  pinctrl-names = "default";  pinctrl-0 = <&spi0_pins_default>; /* 描述引脚复用节点 */  ti,spi-num-cs = <2>;      /* 描述片选的数量 */  ti,pindir-d0-out-d1-in = <1>; /* 描述输入输出分别是哪个 */    /* 描述子节点spidev0设备 */  spidev@0 {              spi-max-frequency = <24000000>; /* 描述spidev0设备的最大频率 */              reg = <0>;   /* 描述spidev0设备所用的片选,这里是第0个 */              spi-cs-high;  /* 描述spidev0设备高有效 */              compatible = "rohm,dh2228fv";  /* 描述spidev0设备所用驱动 */  };  /* 描述子节点spidev1设备 */  spidev@1 {              spi-max-frequency = <24000000>;              reg = <1>;              compatible = "rohm,dh2228fv";  };};
3. 编译烧录:在源码路径下输入以下命令:​​​​​​​. build.shsudo ./build.sh kernel没有报错即为编译成功。
将源码路径下的image中的OK6254-C.dtb文件放到开发板的/boot目录中,重启开发板即可。
4. SPI测试:将spi0_D0和spi0_D1短接重启开发板后,在/dev目录下看到多出两个spidev设备。使用我们的测试程序
[*]
fltest_spidev_test -D /dev/spidev3.0 -s 42000
有如下打印信息即为成功:spimode: 0bitsper word: 8maxspeed: 42000 Hz (42 KHz)FFFF FF FF FF FF4000 00 00 00 95FFFF FF FF FF FFFFFF FF FF FF FFFFFF FF FF FF FFDEAD BE EF BA ADF00D