(5) 主机接收从机数据时,如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送。7 {4 p7 S4 t& M+ j3 c! V
% B2 r3 W* n* `, f
SPI工作时序图如下:
$ p! h( u* ]( v! ~# |" v& ~
2、AM62x处理器中SPI总线的特点在AM62x这款芯片中,TI将SPI的MISO与MOSI设计为d0和d1,具体哪一个作为输入,哪一个作为输出,是由设备树中的 ti,pindir-d0-out-d1-in= <1>来设置的。
5 X: z$ x% |$ @& H' X默认属性值为0,即d0是输入,d1是输出;
当属性值为1时,d0为输出,d1为输入。
# ^9 R; S1 d" G8 F" ]3、AM62x的SPI应用(1)menuconfig配置:
将该项选中,SPI驱动将编译进内核中。
makemenuconfi
DeviceDrivers ->
SPIsupport ->
Usermode SPI device driver support
! z: E5 |' l! _$ v& c' |0 q* M+ M(注:在飞凌嵌入式OK6254-C开发板中,SPI驱动编译已进去。)
c# V' z. u8 k, Y6 q' d/ l9 p
(2)设备树配置:
1) 选择需要使用的spi,这里我们用spi0,节点为&main_spi0;
2) 将该节点所用的引脚复用为相应的功能。
2 u% B0 ?( [1 P* u9 d& p
- 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 */
- >;
- };/ I6 b; [3 V* c1 t k: [
: K7 m; |' g/ M7 i) k
6 t# }, r+ J) S: C* t4 q9 h" o& \7 k
# j+ I7 }' X6 c% K9 Q# p/ t) {0 H/ P3) 描述节点的属性,具体配置项的功能见注释。
' ~( z' O8 Z+ O- E! P- &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";
- };
- };
2 j2 b+ v& ^/ n* c. t. y
3 T( m3 b: ^/ g$ ~: H
9 G0 [ j4 j( Z% C/ x& n8 q* h' ?
9 ^4 R o1 p2 |/ O9 C4 w
(3)编译烧录:
在源码路径下输入以下命令:
0 a! {) l- N4 N% H! i5 i- . build.sh
- sudo ./build.sh kernel( a9 v1 O% E* D6 H- q0 K
- E% x- b; m5 H3 G3 I+ m8 E( ?
" i2 x! |# G: e9 x, Y2 E6 m" V3 }: p' q0 p6 N( e/ A
f! t7 U& o% I# z1 M; x$ j. [0 \
没有报错即为编译成功。
将源码路径下的image中的OK6254-C.dtb文件放到开发板的/boot目录中,重启开发板即可。
' D \/ U; W& N+ p+ J+ |+ p' U2 m
(4)SPI测试:
将spi0_D0和spi0_D1短接
重启开发板后,在/dev目录下看到多出两个spidev设备。
使用我们的测试程序
fltest_spidev_test -D /dev/spidev3.0 -s 42000
- T) U; [: J0 y7 k
有如下打印信息即为成功:
spimode: 0
bitsper word: 8
maxspeed: 42000 Hz (42 KHz)
FFFF FF FF FF FF
4000 00 00 00 95
FFFF FF FF FF FF
FFFF FF FF FF FF
FFFF FF FF FF FF
DEAD BE EF BA AD
F00D
4 [0 f } J5 H0 i0 e5 _4、总结TI AM62x处理器有着丰富的SPI资源,而SPI又可以作为许多设备的总线,这使得AM62x能够接入许多SPI接口的设备,因此在那些对SPI有着比较多需求的应用场景下,TI AM62x无疑是一个非常好的主控选择。