【平头哥杯】TXW8301 与 wujian100 进行 SPI 通信问题

问答 ⋅ 于 2021-05-06 18:12:33 ⋅ 最后回复由 大菠萝 2021-05-31 16:34:09 ⋅ 934 阅读

问题描述

在线调试个人编写的TXW8301SPI通信程序(读取wujian100通过SPI发送的数据)时,会阻塞在SPI读取数据的函数内,具体为:
/* wait until spi is ready to receive /

while (!hgspi_dw_get_rx_ready_sta(p_spi)); / blocked /

下面是TXW8301SPI与wujian100的具体设置:

wujian100与TXW8301SPI通信设置

SPI主机:wujian100,约每0.5秒发送一个字节,数据内容为1到100循环递增的整数

SPI从机:TXW8301,约每0.3秒读取一次SPI数据,每次读取一个字节

wujian100SPI配置:

初始化程序:(参考了SPI例程,选取USI0作为MY_USI_IDX)
file

每0.5秒发送一次:
file

并且在这0.5秒定时发送函数内添加了一个指示灯,每次发送后翻转该灯的亮灭状态,用来指示该定时程序运行正常。(wujian100上电全速运行后,灯闪烁正常)。

引脚:USI0的引脚NSS、SCLK、SD0、SD1已分别引到PMOD口JC的1-4引脚

TXW8301SPI配置:

初始化程序:(没有例程,扒库函数扒出来的)
根据相关文档说明,选取SPI1作为TXW8301SPI:
file

之后尝试在循环里读取主机发送的SPI数据:
file

TXW8301与wujian100的引脚连接:
file

根据上图描述,A7接wujian100的SCLK,A6接wujian100的NSS,另外两根通讯线由于不清楚MOSI与MISO,所以使用时,有尝试两种接法,即IO0接SD0、IO1接SD1和IO0接SD1、IO1接SD0。

其他程序更改:
发现了0006程序中其他占用A6A7A8A9的几个task函数,给注释掉了,具体为wnb_pairkey_task和wnb_rolekey_task

pin_function.c中,个人认为从机的CLK与CS应该均为DIR_INPUT,进行了如下更改:
file

调试的最终结果表示,程序阻塞在了spi1.dev.read()程序中,具体为while (!hgspi_dw_get_rx_ready_sta(p_spi));

问:

请问这里的阻塞是什么意思、怎样可以解除?以及上述设置中有哪些问题?谢谢!

回复数量: 15
  • 大菠萝
    2021-05-08 16:04:08

    说明

    1. 阻塞接收是需要等待接收fifo非空才会读取数据回来,否则没有数据调用spi read会卡在while处等待。不建议直接调用spi read读取数据,要自行安排好合理时序或利用额外IO中断操作。注意TXW8301 SPI0/1只能作为主机使用,使用从机要使用SPI3。SPI3的pin_function没有设置需要参照SPI1添加代码(但注意CS引脚也是设置为复用功能)。
    2. pin_function.c文件中对于SPI的IO设置,是直接设置为复用功能即可,对应的复用功能会自动调整IO的方向。
    3. SPI3的引脚连接没有说明出来(在pin_names.h文件中能看到SPI3引脚定义),引脚复用与SPI1有区别,具体为SPI3_CLK(PA6)为CLK,SPI3_IO0(PA7)为MOSI,SPI3_IO1(PA8)为MISO,SPI3_CS(PA9)为CS。
    4. hgspi_dw_attach(HG_SPI1_DEVID, &spi1)函数在device.cdevice_init(void)已经绑定不用重复操作。但如使用SPI3需要添加hgspi_dw_attach(HG_SPI3_DEVID, &spi3)函数和spi3结构体,可参照spi1结构体复制。
    5. 代码中会有部分功能用到PA6~PA9与SPI冲突可以屏蔽对应task或者在project_config.h中定义IGONOR_ROLE_IOIGONOR_PAIR_KEY两个宏也可以屏蔽,条件编译实现,具体参考代码中。

    需要修改的地方截图

    pin_function.c文件中spi_pin_func(int dev_id, int request)内添加开关SPI3时对于引脚功能设置

    file

    device.c文件中添加SPI3的结构体并且在device_init(void)添加设备函数绑定

    file
    file

    pin_names.h文件中修改SPI3时添加引脚定义

    file

    hgspi_dw.c文件中hgspi_dw_read(struct spi_device p_spi, void buf, uint32 size)内修改代码,否则会影响之后的发送

    file

    最后附测试截图

    file

  • 2021-05-08 23:11:11

    十分详细,非常感谢!

  • Deemo
    2021-05-11 18:12:52

    请问一下你在SPI初始化函数中使用的sys_thread_new();这个函数是干嘛用的呀?

  • 2021-05-13 15:59:08

    @Deemo 用于操作系统开出一个新线程,和SPI本身没有太大关系

  • 111
    2021-05-17 19:37:23

    @榆 你好,拉起spi的handle是片选信号吗,还是spi_t?

  • lijiawei
    2021-05-20 15:29:15

    @大菠萝 您好,我参考你们的修改0006工程后编译报了这个错,error: 'spi3' undeclared (first use in this function),想问一下main函数里的spi3是需要额外声明的吗,如果需要应该怎么声明,谢谢了!

  • 大菠萝
    2021-05-20 15:41:22

    @lijiawei spi3原本工程中是没有定义,参考1楼回复可以在device.c中定义好,然后在需要使用的地方可以通过device_get的方式获取spi3的dev指针使用,类似这样

    file

  • lijiawei
    2021-05-20 17:07:56

    @大菠萝 非常感谢!!

  • Deemo
    2021-05-25 13:05:47

    @大菠萝 @榆 那个大佬们,关于SPI的主从通信,我有几个疑问想请教您一下:
    1、从机的时钟不是由主机提供的吗?为什么还要给从机设置时钟频率;
    2、如果配置的是SPI全双工通信的话,从机不应该向主机发送数据后,主机收到后才进行下一次发送吗,为什么这里没有配置从机向主机发送数据;
    3、我再0006的SPI相关的函数中没有找到如何配置传输数据是8位还是16位,以及大端还是小端,请问0006的默认配置是小端16位格式传输的吗?

  • 大菠萝
    2021-05-25 13:43:56

    @Deemo

    1. 从机时钟确实是主机给的,你观察hgspi_dw.c文件中hgspi_dw_open函数可以发现是因为驱动中没有细致区分主从时钟赋值问题,这里传进去的时钟频率实际上只有主机会需要用上。
    2. SPI通信时序是由主机决定的,SPI主机发出时钟的时候,根据你设置的mode不同,会在时钟上升沿或者下降沿读取数据,在此之前SPI从机应该事先准备好数据,否则主机读取的数据就错误。
    3. 同时也能看到配置中默认是8位传输的数据,标准SPI是MSB传输。
  • Deemo
    2021-05-25 16:07:29

    @大菠萝 好的好的,非常感谢

  • 青春期狗头少年
    2021-05-26 00:47:42

    请问 除了照回答一中 修改代码外(并修改宏定义了)
    file

    以及调用下面的函数
    file

    还需要完成 那些工作 ,我目前还是调不出来。谢谢

  • 对方正在输人
    2021-05-31 16:15:26

    @大菠萝 你好请问一下这里配置的spi3是不是既可以用作主机,也可以用作从机?如果用作主机时只需要改为SLAVE_MODE吗

  • 大菠萝
    2021-05-31 16:29:20

    @对方正在输人 SPI3只能做从机

  • 大菠萝
    2021-05-31 16:34:09

    @青春期狗头少年 你的主机spi方发送时CS引脚需要在结束发送前拉低(CS有效),发送接收拉高(CS无效)。CS一直维持低电是接收不到数据。

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter