[STM8] STM8 SPI 例程 通信出错

[复制链接]
 楼主| huangcunxiake 发表于 2017-1-19 17:19 | 显示全部楼层 |阅读模式

这个STM8的SPI通信也够奇葩的,跟STM32有大区别。光判断发送空和接收空的标志还不行,还必须判断忙标志位,而且读数的时候要等忙标志完毕才能读,废话少说上代码:

这是一段发2字节收2字节的代码,注意如果第二个字节接收才有效的话,也需要发送第二个字节才能提供时钟进行接收:

  1. GPIO_WriteLow(GPIOA, GPIO_PIN_3);

  2.         while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET){}
  3.         SPI_SendData(0x80 | 0x75);

  4.         while(SPI_GetFlagStatus(SPI_FLAG_BSY) == SET){}

  5.         while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET){} /* ¸Ã×Ö½Ú¶ªÆú */
  6.         ret1 = SPI_ReceiveData();


  7.         while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET){}
  8.         SPI_SendData(0x75);


  9.         while(SPI_GetFlagStatus(SPI_FLAG_BSY) == SET){}

  10.         while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET){}
  11.         ret2 = SPI_ReceiveData();
  12.         GPIO_WriteHigh(GPIOA, GPIO_PIN_3);


feelhyq 发表于 2017-1-19 17:24 | 显示全部楼层
楼主应该是用的是SPI全双通通信方式,STM8作为主机必须要提供时钟,时钟是伴随着MOSI管脚发送数据而产生的,因此如果仅仅是需要从 从机获取数据,必须由主机(STM8)发送一些dummy数据以便产生时钟使得从MISO管脚有数据接收。
 楼主| huangcunxiake 发表于 2017-1-19 17:24 | 显示全部楼层
曾是不是很简单就实现了?
 楼主| huangcunxiake 发表于 2017-1-19 17:25 | 显示全部楼层
feelhyq 发表于 2017-1-19 17:24
楼主应该是用的是SPI全双通通信方式,STM8作为主机必须要提供时钟,时钟是伴随着MOSI管脚发送数据而产生的 ...

高手啊,说的面面俱到。
feelhyq 发表于 2017-1-19 17:28 | 显示全部楼层
另外一点,判断从机是否完全接收完数据并不能通过发送FIFO空去判断,因为发送FIFO中的数据会先传到移位寄存器中,移位寄存器是一位一位的发送,虽然发送FIFO里面数据没有了,这并不代表从机完全接收到了数据,因为此时数据很可能在移位起存器中正在一位一位的发送出去。而busy(忙等待)标志位判断的就是移位寄存器中的数据是否发送完成。不仅仅是SPI,串口也是这样。
 楼主| huangcunxiake 发表于 2017-1-19 18:03 | 显示全部楼层
feelhyq 发表于 2017-1-19 17:28
另外一点,判断从机是否完全接收完数据并不能通过发送FIFO空去判断,因为发送FIFO中的数据会先传到移位寄存 ...

受教了,讲解的非常给力。
feelhyq 发表于 2017-1-19 18:12 | 显示全部楼层
客气了,共同学习,共同进步
 楼主| huangcunxiake 发表于 2017-1-21 12:31 | 显示全部楼层
如果提供了标准的库函数,还是用库函数操作更好的。方便移植不说,别人也更容易看懂。
usysm 发表于 2017-1-21 17:23 | 显示全部楼层
可以通过模拟SPI发送。
usysm 发表于 2017-1-21 17:27 | 显示全部楼层
以前用过STM的,都是使用的模拟IIC和SPI
 楼主| huangcunxiake 发表于 2017-1-22 15:23 | 显示全部楼层
stm32的觉得比STM8的好用。
Soraka 发表于 2017-1-22 16:06 | 显示全部楼层
用模拟SPI发送,程序都差不多,容易移植
 楼主| huangcunxiake 发表于 2017-1-26 20:28 | 显示全部楼层
GPIO模拟的话,相对就简单了,更易于理解。
febgxu 发表于 2017-1-26 21:51 | 显示全部楼层
如果调试不通,建议模拟spi
febgxu 发表于 2017-1-26 21:52 | 显示全部楼层
这个集成的spi不如模拟的spi好调试。
wahahaheihei 发表于 2017-1-27 13:40 | 显示全部楼层
没有STM32的好用,一直是在用STM32的,很难接受STM8,也没有太多例程参考。
uiint 发表于 2017-1-28 18:42 | 显示全部楼层
usysm 发表于 2017-1-21 17:23
可以通过模拟SPI发送。

使用IO直接模拟SPI吗
uiint 发表于 2017-1-28 18:43 | 显示全部楼层
usysm 发表于 2017-1-21 17:27
以前用过STM的,都是使用的模拟IIC和SPI

这个集成的功能应给更简单一些。
Levenburg 发表于 2017-1-29 19:33 | 显示全部楼层
建议用模拟spi
 楼主| huangcunxiake 发表于 2017-1-30 12:48 | 显示全部楼层
while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET){}

        ret1 = SPI_ReceiveData();
当收到这个状态标志位时候启动接收?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

222

主题

3700

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部

222

主题

3700

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部