FPGA 与Beaglebone的SPI通信

经过几天对linux 4.14内核源码中的spidev_test.c 、spidev.c的研究,初步实现FPGA 与BeagleBone的SPI通信。

 

  • BeagleBone端指令:

./spidev_test -D /dev/spidev2.0 -H -o result.txt -S4096 -I1 -v -b 16

注:注意这个-符号,word会将其更改

./spidev_test -D /dev/spidev2.0 -H  -S1024 -I1 -b16 -s1000000 -o result.bin -v

参数说明:

-D --device

device to use (default /dev/spidev1.1),设置启动的SPI设备,spidev1.0  spidev1.1  spidev2.0  spidev2.1

-s --speed

max speed (Hz) 32个字节表示,4294967295Hz ,最大可设置为4296Mhz,肯定够用。

-d –delay

       delay (usec),发送完成一帧数据后的延时时间,单位微秒。

-b --bpw

       bits per word,一帧数据的字节数,uint8_t bits = 8,默认八位。

-i --input

input data from a file,SPI发送的数据来源于该文件,二进制读写 test.txt,不能与-p同时设置。

-o --output

       output data to a file,SPI接受的数据存储的地方。

-l --loop

回环模式,无参,自动检测通信,如果接受的数据和发送的数据一样则打印出来,不一样则报错。使用该模式必须指定-S –I

-H --cpha

clock phase,时钟相位设置,无参,设置后SPI_CPHA=1

-O --cpol

clock polarity,时钟极性设置,无参,设置后SPI_CPOL=1

-L --lsb

least significant bit first,无参,lsb最低位有效先传输还是最后传输,在大端模式下,二进制数据的最低有效位在右边,最高有效位在左边,默认则是传送二进制数据从左向右传,设置之后则变成从右向左传。

-C --cs-high

chip select active high,拉高片选,无参。

-3 --3wire

SI/SO signals shared,三线制SPI,收发数据公用一条线。

-v --verbose

Verbose (show tx buffer),显示数据,无参,在终端中可打印出数据。

-p           

Send data  "1234\\xde\\xad\" 终端键入发送数据的格式

-N --no-cs   

no chip select

-R --ready   

slave pulls low to pause

-2 --dual    

dual transfer,SPI的读写速度是普通序列式闪存的2-3倍,DI和DO是双向的,称作DI0 DI1

-4 --quad    

quad transfer,SPI的读写速度是普通序列式闪存的4-6倍;DI和DO是双向的,称作DI0 DI1,同时,/WP和/HOLD也变成输入输出管脚,称作DI2 DI3

-S --size    

transfer size\n" 发送随机数据的字节数,int,型不能超过 bufsiz=4096

-I --iter    

iterations\n"); 发送随机数据循环接收的次数,int型

 

BeagleBone中SPI程序未运行时:

cs : 高电平

miso : 低电平

mosi : 高电平

sck : 低电平

 

SPI:MODE1    CPOL=0    CPHA=1

第一个沿数据传输,第二个沿数据采集,sck空闲时低电平,片选低电平有效。

 

在实际分析时序之时,发现FPGA工程中写的片选信号在完成一个数据传输之后就拉高一次的时序与BeagleBone的SPI协议不符合,CS片选线只在一次完整的通信过程中拉低一次,所以需要对FPGA中SPI程序进行修改,将数据的触发保存信号改为wr_over信号,该信号由计数器计数,产生16个计数时,拉高一次,完成一个16位数据传输。wr_over信号的上升沿wr_over_p时刻,对采集到的数据保存;wr_over信号的下降沿wr_over_n时刻,将要发送的数据传入发送寄存器中保存。

 

  • 数据大小端问题

在实际数据通信的调试过程中,发现FPGA从二进制数据左侧高位开始发送,低位结束,满足Beaglebone采集顺序,但是因为是16位,两个字节,而先发过去的高位数据被放到了低位,低位数据被放到了高位,所以在FPGA中需要对数据顺序进行处理。

经过程序调试之后,测试结果如下:

6F6B : 0110 1111 0110 1011

3231 : 0011 0010 0011 0001

023F : 0000 0010 0011 1111

0001 : 0000 0000 0000 0001

 

Beaglebone TX  < == >  slaver_dout

Beaglebone RX  < == >  slaver_din

 

Speed : 4MHZ

Beagbone端发送6F6B,FPGA 的slaver_dout的接受到的第一个数据为无效数据,第二个数据为接受到的有效数据,为0110 1111 0110 1011b,与BBB端一致

BeagleBone端发送的第二个数据3231,FPGA接受到的第三个数据0011 0010 0011 0001b,一致。

FPGA端发送的第一个数据0000 0010 0011 1111,BeagleBone端接受到的第二个数据023F一致。

FPGA端发送的第三个数据0000 0000 0000 0001,BeagleBone端接受到的第三个数据0001一致。

 

Speed : 10MHZ

 

Speed : 16MHZ 数据异常

 

Speed : 11MHZ  FPGA slaver_din异常

 

在正常10Mhz的速度下,传输经过FFT变换的1024个字节的数据,数据正常:

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值