我要使用SPI接口从ATT7022E中读取指定的寄存器,为什么总会延迟四个字节?

2019-07-20 21:14发布

买了原子的F4的开发板,照着原子哥的例程写了个SPI通讯程序驱动ATT7022E,SPI初始化和端口设置应该是正常的,但现在问题是每次读寄存值,总是在下一次操作是才能读到上一次要的结果,这个程序该怎么写才正确? ATT7022E是先发送1个8位的操作数,等2US左右再读写24位数据,问题是:SPI是全双工的,在发送的同时就接收数据,我如果先发8位指令,再接收,结果就会丢失高8位,如下面程序 u32 SPI_ATT_Read(u8 data)
 {
  u32 temp=0;
 ATT7022E_CS=0;  SPI1_ReadWriteByte(data);  delay_us(5);  temp=SPI1_ReadWriteByte(data);
 temp<<=8;
 temp|=SPI1_ReadWriteByte(data);
 temp<<=8;
 temp|=SPI1_ReadWriteByte(data);
 ATT7022E_CS=1;
 return (temp);
  }
如果发送同时接收,可以正常收到24位返回值,但是问题是每次发的指令,该指令对应的返回值要在下一次读的时候才能正确读出来,如下面的程序 u32 SPI_ATT_Read(u8 data)
 {
  u32 temp=0;
 ATT7022E_CS=0;  temp=SPI1_ReadWriteByte(data);
 temp<<=8;
 temp|=SPI1_ReadWriteByte(data);
 temp<<=8;
 temp|=SPI1_ReadWriteByte(data);
SPI1_ReadWriteByte(data);  ATT7022E_CS=1;
 return (temp);
  }
我才学ARM不久,有点糊了,按ATT7022E的手册应该第一个程序是对的,但实际运行结果是高8位丢失,后面的程序是,每个读操作要第二次读才能读出上次发的操作数对应的结果。这个问题搞了两天了,没搞定,请各位高手帮帮我。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
正点原子
1楼-- · 2019-07-20 22:11
这个挺正常的吧,你发指令以后,肯定要等待一段时间,才能读出指令的返回值。
难不成你一边发指令,还能一边收指令的返回值?
除非对方提前知道你要发送的指令,否则怎么可能一边接受指令,一边给你指令的应答?
chenrj
2楼-- · 2019-07-21 00:06
谢谢原子哥,这么快就有回复,我也是这样理解的,发指令后等一段时间就应该能读出指令的返回值,但实际上,如果延时一段时间读返回值就会把返回值(共24位)的最前面8位丢失(如第一个程序所示)。
我后来把读程序改成下面的,就是先发四次读指令,再读返回值,发现这样每次都可以正确的读出返回值,但写数据程序不知道怎么改才行。
u32 SPI_ATT_Read(u8 data)
 {
  u32 temp=0;
 ATT7022E_CS=0;
SPI1_ReadWriteByte(data);
SPI1_ReadWriteByte(data);
SPI1_ReadWriteByte(data);
SPI1_ReadWriteByte(data);
 //    delay_us(10);
temp=SPI1_ReadWriteByte(data);
temp<<=8;
temp|=SPI1_ReadWriteByte(data);
temp<<=8;
temp|=SPI1_ReadWriteByte(data);
SPI1_ReadWriteByte(data);
ATT7022E_CS=1;
return (temp);
 
 }
chenrj
3楼-- · 2019-07-21 03:12
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-21 05:46
 精彩回答 2  元偷偷看……
chenrj
5楼-- · 2019-07-21 09:05

今天为排除UCOSII可能造成的影响,单独写了一个裸机程序,结果和上面的测试一样,证明问题不是由UCOS引起的,原子哥说看数据手册,关键是手册都不知道看了多少遍了,按手册上的例程,用IO摸拟SPI,结果更离奇,每次读的值都不一样。

三叶草
6楼-- · 2019-07-21 13:33
有酬劳的话,我可以帮你全部搞定!!

一周热门 更多>