使用模拟SPI通信程序如下:
#define ADIS16209_SCLK PBout(3)#define ADIS16209_CS PBout(4)#define ADIS16209_RST PBout(5)#define ADIS16209_MOSI PBout(6)#define ADIS16209_MISO PBin(7)
//SPI1 读写一个字节//TxData:要写入的字节//返回值:读取到的字节
void SendByte(uint8_t byte){ uint8_t i=0; for(i=0;i<8;i++) { ADIS16209_SCLK = 0; if(0X80&byte) ADIS16209_MOSI = 1; else ADIS16209_MOSI = 0; delay_us(40); ADIS16209_SCLK = 1; delay_us(40); byte <<= 1; }}
uint8_t GetByte(void){ uint8_t i,j,aa = 0; for(i=0;i<8;i++) { ADIS16209_SCLK = 0; aa=aa<<1; if(ADIS16209_MISO) aa = aa | 0x01; else aa = aa | 0x00; delay_us(40); ADIS16209_SCLK = 1; delay_us(40); } return aa;}
uint8_t ADIS16209_RD(uint8_t Dst,uint8_t *RcvBuf){ uint16_t i = 0; ADIS16209_CS = 0; delay_us(50); SendByte(Dst&0x3f); SendByte(0x00); ADIS16209_CS = 1; delay_us(50); ADIS16209_CS = 0; delay_us(50); for(i=0;i<2;i++) { RcvBuf[i] = GetByte(); } ADIS16209_CS = 1; delay_us(50); return 1;}
int main(void){ //IO口初始化程序,这里没有贴出来 ADIS16209_RST=0; delay_ms(50); ADIS16209_RST=1; delay_ms(50); ADIS16209_CS = 1; delay_ms(50); while(1) { ADIS16209_RD(0x02,RxBuffer); }}
使用调试器仿真调试,全速运行,Rxbuffer的数据不变化,单步调试时,有变化,不知问题出在哪里了?
如下波形图:
CS与sclk波形
SCLK 与 MOSI波形如下
数据是在SCLK下降沿变化,对不对?(有个同事说数据要在SCLK上升沿变化,我认为不对,我看ADIS16209资料中的时序是下降沿数据变化)
忘帮助解决一下:数据为什么不出来,多谢!
程序是否存在问题呢?
请给出一个完整的SPI读周期时序,含CS, SCLK, SDIO, SDO,先尝试连续读取Product_ID,十进制结果应该为16209。
你好,读取ID的波形图如下:
示波器测量MISO波形如下:
但是 我又读取 0X0C寄存器数据,即使我晃动传感器 数据始终是一样的,没有变化
在调试模式下,在传感器读取函数位置增加断点,单步调试,数据就有改变,望解疑惑,多谢!
你好 ,读0X4A ID寄存器返回的数据为0X3F51也即16209
但读 0x0c 寄存器的数据 只返回一次数据,循环读这个寄存器的数据,数据不改变与第一次读出的一致,怎么回事?望解答多谢!
请增加Tstall (CS为高电平的时间)到1ms.