OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10369|回复: 5

stm32F207的spi发送接收第一个数据错误问题

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-4-11
在线时间
0 小时
发表于 2014-8-13 10:09:57 | 显示全部楼层 |阅读模式
5金钱
最近在用spi调试TI 的ADS芯片,读12个寄存器,出现:第一个数据为0,后续11个数据正确。
     这样读寄存器的,先发送两个opcode,然后再读取寄存器数据。
[mw_shl_code=c,true] val1 = SPI1_Send_byte(SPI_Tx_buf[0]); delay_us(10); val2 = SPI1_Send_byte(SPI_Tx_buf[1]); delay_us(10); val3 = SPI1_Receive_byte(); delay_us(15);[/mw_shl_code]
SPI 为全双工,8bit,CPOL=0,CPHA=1,主机模式。

关于读写数据函数,
[mw_shl_code=c,true]uint16_t SPI1_Send_byte(uint16_t data) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, data); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(SPI1); } uint16_t SPI1_Receive_byte(void) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, 0x00); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(SPI1); }[/mw_shl_code]

 我尝试,短接MOSI和MISO引脚,按一下测试:
   
[mw_shl_code=c,true]uint8_t rev_buff[20]; uint8_t sed_buff[20]= {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15}; for(i=0;i<15; i++) { rev_buff = SPI1_Send_byte(sed_buff); delay_ms(1); }[/mw_shl_code]
接收到的数据为:
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14
 
这啥情况? 路过大侠,帮忙回答解决下问题啊。

关于SPI的配置:
[mw_shl_code=c,true] SPI_I2S_DeInit(SPI1); SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low ; SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft ; SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStruct.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStruct); SPI_Cmd(SPI1, ENABLE);[/mw_shl_code]





最佳答案

查看完整内容[请看2#楼]

忘记了,我来结贴吧。   读ADS1192寄存器的操作为: [mw_shl_code=c,true] SPI1_Send_byte(SPI_Tx_buf[0]); SPI1_Send_byte(SPI_Tx_buf[1]); retVal = SPI1_Receive_byte();[/mw_shl_code] SPI读写操作函数如下: [mw_shl_code=c,true]uint16_t SPI1_Send_byte(uint16_t data) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); / ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-4-11
在线时间
0 小时
 楼主| 发表于 2014-8-13 10:09:58 | 显示全部楼层
忘记了,我来结贴吧。
 

读ADS1192寄存器的操作为:


[mw_shl_code=c,true] SPI1_Send_byte(SPI_Tx_buf[0]); SPI1_Send_byte(SPI_Tx_buf[1]); retVal = SPI1_Receive_byte();[/mw_shl_code]


SPI读写操作函数如下:

[mw_shl_code=c,true]uint16_t SPI1_Send_byte(uint16_t data) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //????·????????? SPI_I2S_SendData(SPI1, data); //????????±?·????????????÷?????? ????·????ê?è??17us(CLK=470KHZ??~2.12us), ???????±17us,???? delay_us(20); //while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //????·????????? --> ??·?·¨???????í?ó while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //???????????????? return SPI_I2S_ReceiveData(SPI1); } uint16_t SPI1_Receive_byte(void) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, 0x00); delay_us(20); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(SPI1); }[/mw_shl_code]


如果不加延时,读ADS1192寄存器操作会引起SPI_I2S_SendData(SPI1, data);连续发送三次,刚开始中间间隙很短(几乎没有间隙),连续产生24个时钟信号,从机无法判断是8bit还是16bit格式,从机会认为SPI是以16bit数据格式发送,之后再判断是8bit,所以导致读12个寄存器,出现第一个数据错误为0x00,而后续11个数据正确。


回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-13 12:38:34 | 显示全部楼层
SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
这句换成这样看下
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;


你设置了SPI时钟空闲低电平,相应的就是第一个上升沿接收数据吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-4-11
在线时间
0 小时
 楼主| 发表于 2014-8-13 13:40:20 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
手册上要求是 CPOL =0, CPAH=1。 波形是正确的,读数据却丢失第一个数据
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-4-11
在线时间
0 小时
 楼主| 发表于 2014-8-13 13:42:11 | 显示全部楼层



第一个数据波形,0x51,读出来却为0x00
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-13 17:09:01 | 显示全部楼层
回复【4楼】独舞洪荒:
---------------------------------
这么坑
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 02:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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