完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
您好,最近在写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单片机写的驱动能让板子正常工作的。 |
|
相关推荐
1个回答
|
|
您好,根据您的描述,您在编写AFE4400在STM32上的驱动程序时遇到了寄存器配置失败的问题。您提到在往一个寄存器写入一个字节后,再读取时读出来的值不一致,总是0xFFFFFF。您在论坛上看到在STM32上用SPI通信配置寄存器时,读取和写入都需要延时3ms,于是您修改了SPI读写程序。
首先,我们需要分析可能导致寄存器配置失败的原因: 1. 硬件连接问题:请检查AFE4400与STM32之间的硬件连接是否正确,包括SPI接口的连接、电源和地线等。 2. SPI配置问题:请确保STM32的SPI配置正确,包括时钟频率、CPOL、CPHA、数据位宽度等参数。 3. 延时问题:您提到在论坛上看到需要延时3ms,但这个延时可能并不适用于所有情况。您可以尝试不同的延时时间,或者使用更精确的延时方法,如使用定时器。 4. 读写顺序问题:在您的代码中,您先写入地址,然后写入数据的高8位、中8位和低8位。请确保这个顺序是正确的,并且每个字节之间有足够的延时。 5. 寄存器保护问题:有些寄存器在写入之前需要解锁或清除保护位。请检查AFE4400的数据手册,确保您正确地处理了这些寄存器。 针对以上可能的原因,您可以尝试以下解决方案: 1. 检查硬件连接,确保所有连接都正确无误。 2. 重新检查STM32的SPI配置,确保时钟频率、CPOL、CPHA等参数设置正确。 3. 尝试不同的延时时间,或者使用更精确的延时方法,如使用定时器。 4. 确保读写顺序正确,并在每个字节之间添加足够的延时。 5. 检查AFE4400的数据手册,确保您正确地处理了寄存器保护位。 希望以上建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我们进一步分析。 |
|
|
|
只有小组成员才能发言,加入小组>>
291 浏览 1 评论
502 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
735 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
632 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1102 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
212浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
169浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
42浏览 13评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
144浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
148浏览 12评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-13 10:19 , Processed in 0.993636 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号