打印
[STM8]

STM8 SPI 例程 通信出错

[复制链接]
1801|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangcunxiake|  楼主 | 2017-1-19 17:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

GPIO_WriteLow(GPIOA, GPIO_PIN_3);

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

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

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


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


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

        while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET){}
        ret2 = SPI_ReceiveData();
        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管脚发送数据而产生的 ...

高手啊,说的面面俱到。

使用特权

评论回复
5
feelhyq| | 2017-1-19 17:28 | 只看该作者
另外一点,判断从机是否完全接收完数据并不能通过发送FIFO空去判断,因为发送FIFO中的数据会先传到移位寄存器中,移位寄存器是一位一位的发送,虽然发送FIFO里面数据没有了,这并不代表从机完全接收到了数据,因为此时数据很可能在移位起存器中正在一位一位的发送出去。而busy(忙等待)标志位判断的就是移位寄存器中的数据是否发送完成。不仅仅是SPI,串口也是这样。

使用特权

评论回复
6
huangcunxiake|  楼主 | 2017-1-19 18:03 | 只看该作者
feelhyq 发表于 2017-1-19 17:28
另外一点,判断从机是否完全接收完数据并不能通过发送FIFO空去判断,因为发送FIFO中的数据会先传到移位寄存 ...

受教了,讲解的非常给力。

使用特权

评论回复
7
feelhyq| | 2017-1-19 18:12 | 只看该作者
客气了,共同学习,共同进步

使用特权

评论回复
8
huangcunxiake|  楼主 | 2017-1-21 12:31 | 只看该作者
如果提供了标准的库函数,还是用库函数操作更好的。方便移植不说,别人也更容易看懂。

使用特权

评论回复
9
usysm| | 2017-1-21 17:23 | 只看该作者
可以通过模拟SPI发送。

使用特权

评论回复
10
usysm| | 2017-1-21 17:27 | 只看该作者
以前用过STM的,都是使用的模拟IIC和SPI

使用特权

评论回复
11
huangcunxiake|  楼主 | 2017-1-22 15:23 | 只看该作者
stm32的觉得比STM8的好用。

使用特权

评论回复
12
Soraka| | 2017-1-22 16:06 | 只看该作者
用模拟SPI发送,程序都差不多,容易移植

使用特权

评论回复
13
huangcunxiake|  楼主 | 2017-1-26 20:28 | 只看该作者
GPIO模拟的话,相对就简单了,更易于理解。

使用特权

评论回复
14
febgxu| | 2017-1-26 21:51 | 只看该作者
如果调试不通,建议模拟spi

使用特权

评论回复
15
febgxu| | 2017-1-26 21:52 | 只看该作者
这个集成的spi不如模拟的spi好调试。

使用特权

评论回复
16
wahahaheihei| | 2017-1-27 13:40 | 只看该作者
没有STM32的好用,一直是在用STM32的,很难接受STM8,也没有太多例程参考。

使用特权

评论回复
17
uiint| | 2017-1-28 18:42 | 只看该作者
usysm 发表于 2017-1-21 17:23
可以通过模拟SPI发送。

使用IO直接模拟SPI吗

使用特权

评论回复
18
uiint| | 2017-1-28 18:43 | 只看该作者
usysm 发表于 2017-1-21 17:27
以前用过STM的,都是使用的模拟IIC和SPI

这个集成的功能应给更简单一些。

使用特权

评论回复
19
Levenburg| | 2017-1-29 19:33 | 只看该作者
建议用模拟spi

使用特权

评论回复
20
huangcunxiake|  楼主 | 2017-1-30 12:48 | 只看该作者
while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET){}

        ret1 = SPI_ReceiveData();
当收到这个状态标志位时候启动接收?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

205

主题

3522

帖子

11

粉丝