您好,最近在写AFE4400在STM32上的驱动程序,发现寄存器配置总是失败。为什么会有这个判断?因为往一个寄存器写入一个字节后然后再读,读出来的值不一致,总是 oxFFFFFF,我在前在论坛上看到,在STM32上用SPI通信配置寄存器时,读取和写入都需要延时3ms,于是,我把SPI读写程序改成如下
void afe44xxWrite (uint8_t address, uint32_t data)
{
SPI_AFE44xx_CS=0;// enable device 选择从设备
SPI1_ReadWriteByte(address);
SPI1_ReadWriteByte((data >> 16) & 0xFF);// write top 8 bits
SPI1_ReadWriteByte((data >> 8) & 0xFF);//write middle 8 bits
SPI1_ReadWriteByte(data& 0xFF);//write bottom 8 bits
SPI_AFE44xx_CS=1;// disable device}
uint32_t afe44xxRead (uint8_t address)
{ uint32_t data=0;
SPI_AFE44xx_CS=0;
SPI1_ReadWriteByte(address);
data |= ((unsigned long)SPI1_ReadWriteByte (0)<<16); // read top 8 bits data
data |= ((unsigned long)SPI1_ReadWriteByte(0)<<8); // read middle 8 bits data
data |= SPI1_ReadWriteByte(0); // read bottom 8 bits data
SPI_AFE44xx_CS=1;
return data; // return with 24 bits of read data
}
其中,SPI1_ReadWriteByte函数定义如下
u8 SPI1_ReadWriteByte(u8 TxData)
{ u16 retry=0; while((SPI1->SR&1<<1)==0)//等待发送区空 {
retry++;
if(retry>0XFFFE)return 0;
} SPI1->DR=TxData; //发送一个byte retry=0;
while((SPI1->SR&1<<0)==0) //等待接收完一个byte {
retry++;
if(retry>0XFFFE)return 0;
} return SPI1->DR; //返回收到的数据}
为了满足延时3ms时间,我把SPI1_ReadWriteByte函数里的retry造成的延时删去,然后在afe44xxWrite和afe44xxRead 函数里调用SPI1_ReadWriteByte的前后都加上 延时3ms的程序,可是用串口检查,即先写入一个寄存器,后再读寄存器,发现两者数值也不一样,对两个不同寄存器进行先写后读操作,两个寄存器读出的值均是0XFFFFFF,不知道哪里出现问题?请前辈指点,感激不尽
void SPI1_Init(void)
{ RCC->APB2ENR|=1<<2; //PORTA时钟使能 RCC->APB2ENR|=1<<12; //SPI1时钟使能 //这里只针对SPI口初始化
GPIOA->CRL&=0X000FFFFF; GPIOA->CRL|=0XBBB00000;//1011 PA5.6.7复用 GPIOA->ODR|=0X7<<5; //PA5.6.7 再上拉输出
SPI1->CR1|=0<<10;//全双工模式 SPI1->CR1|=1<<9; //SSM位,启动软件从设备管理 当SSM被置位时,NSS引脚上的电平由SSI位的值决定。 SPI1->CR1|=1<<8; //SSI:内部从设备选择 (Internal slave select)
//该位只在SSM位为’1’时有意义。它决定了NSS上的电平,在NSS引脚上的I/O操作无效。
SPI1->CR1|=1<<2; //SPI主机
SPI1->CR1|=0<<11;//8 bit数据格式 SPI1->CR1&=~(1<<1); //空闲模式下SCK为0 CPOL=0
SPI1->CR1&=~(1<<0); //数据采样从第1个时间边沿开始,CPHA=0 SPI1->CR1|=7<<3; //Fsck=Fcpu/256 后来在SPI1_SetSpeed()重新定义改作32分频,即2.25M时钟
SPI1->CR1|=0<<7; //MSBfirst SPI1->CR1|=1<<6; //SPI设备使能
//SPI1_ReadWriteByte(0xff);//启动传输(主要作用:维持MOSI为高) 发送一个空字节触发传输需要视驱动对象而定}
硬件不会有问题,因为用arduino单片机写的驱动能让板子正常工作的。
Kailyn Chen:
您好,感谢您对TI产品的关注!由于AFE系列产品属于信息受限制产品,请您发送英文邮件至biosensing_afe-support@list.ti.com获取技术支持。
该产品是由美国的工程师团队支持, 需要用英语沟通。如果英语沟通不便,烦请告知我,我会继续协助。谢谢您的理解和配合!