您好,最近在写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单片机写的驱动能让板子正常工作的。