查看: 2716|回复: 4

[求助] K20的SPI通信从站多发一个字节

[复制链接]
  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
    发表于 2019-10-18 17:38:26 | 显示全部楼层 |阅读模式
    本帖最后由 bjx1234 于 2019-10-18 17:41 编辑

    用KL16做为SPI主站,用K20的SPI0做为SPI从站。主站设置波特率为50kHz.主站和从站之间用SPI_CS引脚来控制收发。
    从站把CS引脚配置成GPIO,并开中断。

    每次要通信时,主站准备好数据,拉低CS;从站收到CS引脚的GPIO中断,初始化SPI0和DMA,配成收发8个字节,启动DMA接收完成中断,然后主站按8个字节收发数据包。

    从站进入DMA接收完成中断,关掉DMA中断,根据收到的数据包,解析出下一次要发的字节数(如44),然后配置DMA传输字节为44,再次启动DMA中断,收发44个字节,然后根据收到报文决定接收完成,此时关掉SPI和DMA,配置CS为GPIO,并打开中断,以便开始下一次通信过程。此时主站拉高CS引脚,也做好下一次通信的准备。

    在此过程中,从站总是会多发一个字节造成传输错位。如图片所示,上面这行数据0xAA, 0x61是从站发出的,下面这行0x61 0x00 0x00 0x00 0x2c 0x00 0x14 0xAA是主站发出的。按设想上下两行应都是0x61开头。
    感觉上像是移位寄存器里总有一个字节发不出来。不知道是怎么回事。



    我知道答案 目前已有4人回答

    a

    a

    b

    b
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24876
    最后登录
    2025-7-18
    发表于 2019-10-21 10:11:16 | 显示全部楼层
    从站在接收主站数据之前,有没有先把你的发送buff填满?如果不填满,当接收到主站的时钟的时候,从机buff会任意填数据出去,所以你先把从机的发送buff填为你要发送的数据。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
     楼主| 发表于 2019-10-21 13:33:10 | 显示全部楼层
    小恩GG 发表于 2019-10-21 10:11
    从站在接收主站数据之前,有没有先把你的发送buff填满?如果不填满,当接收到主站的时钟的时候,从机buff会 ...

    从站接收数据之前是没有填的。我改一下试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
     楼主| 发表于 2019-10-21 14:25:30 | 显示全部楼层
    小恩GG 发表于 2019-10-21 10:11
    从站在接收主站数据之前,有没有先把你的发送buff填满?如果不填满,当接收到主站的时钟的时候,从机buff会 ...

    这个要怎么样写入呢?是不是直接写从站SPI的PUSHR_SLAVE寄存器?另外,我用的是SPI0,它的FIFO还要使能吗?FIFO不使能还能不能引起DMA请求。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24876
    最后登录
    2025-7-18
    发表于 2019-10-22 10:57:57 | 显示全部楼层
    bjx1234 发表于 2019-10-21 14:25
    这个要怎么样写入呢?是不是直接写从站SPI的PUSHR_SLAVE寄存器?另外,我用的是SPI0,它的FIFO还要使能吗 ...

    从机就直接填到buff中,启动初始化之后,直接把FIFO给填了。就是你从机发送的代码,里面有填buffer数据的。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 11:52 , Processed in 0.119066 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表