打印
[STM8]

STM8 SPI 接收数据错误

[复制链接]
4307|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
daweibalang|  楼主 | 2014-11-6 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

MCU: STM8L152C6
环境:STVD
现象:
1、发送正常,可以抓到SCK、SDO的波形正确,也能读取TXE是正确。
2、接收的时候,无论SDI脚是高电平还是低电平,SPI_ReceiveData返回的值都无变化。(STVD的环境也无法监测到DR寄存器的值)

初始化部分:
        CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);

        GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Slow);        //NSS
        GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Slow);        //SCK
        GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Slow);        //SDO
        GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);        //SDI

        SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_16, SPI_Mode_Master,
                        SPI_CPOL_High, SPI_CPHA_2Edge, SPI_Direction_2Lines_FullDuplex,
                        SPI_NSS_Soft, 0x07);
        SPI_Cmd(SPI1, ENABLE);
复制代码


主函数测试部分:
GPIO_WriteBit(GPIOC, GPIO_Pin_5, 0);
                while(!SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE));
                SPI_SendData(SPI1, 0x80);
                for(u16Temp = 0; u16Temp < 100; u16Temp++)
                {
                        ;
                }

                while(!SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE));
                u8RecData = SPI_ReceiveData(SPI1);
复制代码


在接收部分完成的时候打的断点,无论怎么做,都无法改变u8RecData的值。
沙发
daweibalang|  楼主 | 2014-11-6 16:52 | 只看该作者

发现了一个问题,不过还是没能解决。

我发送完数据后,SCK就没有信号了,这是个头疼的问题。
不过我看别人的例子,有说从SDO发送个0,这时就有SCK信号,可以读到SDI的数据。我也试过了,还是不能读到。。。。

这,SPI的接收给卡住了?

SPI的SDI引脚没有其他外设,只是用VCC、GND做连接来测试

使用特权

评论回复
板凳
zhaoyu2005| | 2014-11-6 19:00 | 只看该作者
典型对SPI工作原理不明白。在发送完读命令后,需要继续发送时钟才能读数据,当然得继续发送数据,只不过这个数据一般不被从机识别,实际上SPI就是发送和接收同时进行的

使用特权

评论回复
地板
daweibalang|  楼主 | 2014-11-6 21:20 | 只看该作者
zhaoyu2005 发表于 2014-11-6 19:00
典型对SPI工作原理不明白。在发送完读命令后,需要继续发送时钟才能读数据,当然得继续发送数据,只不过这 ...

我这是从其他平台移植过来的,本来SCK在SPI读的时候就可以产生的。

STM8的我还是刚接触,没理解过来。

使用特权

评论回复
5
jgpiuu| | 2014-11-21 10:27 | 只看该作者
你那都算好的  我才郁闷 用了2片STM8S903K3做2.4G通讯 用的硬件SPI 同样的程序 下载到2个片子里 其中一个工作正常,另一个直接SPI都没输出  用调试仿真 发现SPI的寄存器值都是错的 同样的程序另一个仿真就是对的 初始化中的程序 SPI_CR1 |= 0x40;  正常的芯片SPI就开启了  有问题的那个芯片 仿真得到的值SPI_CR1=0x20  真实无语了 其他IO口控制都还是好的就SPI不行 不知道是硬件本身问题还是有BUG。。。

使用特权

评论回复
6
syney11| | 2015-12-23 22:04 | 只看该作者
jgpiuu 发表于 2014-11-21 10:27
你那都算好的  我才郁闷 用了2片STM8S903K3做2.4G通讯 用的硬件SPI 同样的程序 下载到2个片子里 其 ...

你好,你这个问题解决了吗?  我遇到个神奇的情况,在1000块板子里,950块左右spi工作都是正常的,有50块左右spi模块不工作。  其他接口都工作正常。把全片擦除后重烧写程序就正常了。。很是奇怪

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝