SPI/I2S调试总结
来源:互联网 发布:广州诗悦网络 编辑:程序博客网 时间:2024/05/16 11:03
SPI芯片:W25Q16
I2S芯片:AK4386
主芯片:STM32F105
1.查询标志位:
1)while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);//检查发送是否完成
2)while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);//检查接受标志位
SPI运行时有一定几率程序会卡死在检查接受标志位处RXNE,论坛上的解决方案是将检查接受标志位改为检查忙状态,即:
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY)==SET);
此方案可行。
其根本原因是因为STM32F105的SPI增加了FIFO端口,使传输数据有了缓冲区。可以在SPI初始化是增加语句SPI_RxFIFOThresholdConfig(SPI1,SPI_RxFIFOThreshold_QF);,将应答数据位设置为8位。
有些库函数没有SPI_RxFIFOThresholdConfig函数,完整函数如下:
/** * @brief Configures the FIFO reception threshold forthe selected SPI. * @param SPIx: where x can be 1 or 2 to select the SPIperipheral. * @note SPI2 is not available for STM32F031 devices. * @param SPI_RxFIFOThreshold: specifies the FIFOreception threshold. * This parameter can be one of thefollowing values: * @arg SPI_RxFIFOThreshold_HF: RXNEevent is generated if the FIFO * levelis greater or equal to 1/2. * @arg SPI_RxFIFOThreshold_QF: RXNEevent is generated if the FIFO * levelis greater or equal to 1/4. * @retval None */voidSPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold){ /* Check the parameters */ assert_param(IS_SPI_ALL_PERIPH(SPIx)); assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold)); /* Clear FRXTH bit */ SPIx->CR2 &=(uint16_t)~((uint16_t)SPI_CR2_FRXTH); /* Set new FRXTH bit value*/ SPIx->CR2 |= SPI_RxFIFOThreshold;}
PS:如果RXNE仍然反复置位,可参考STM32F030与STM32F411的SPI调试经验–兼RXNE不能置位的原因一文关闭SPI寄存器的监控窗口或者修正硬件。
2. STM32105芯片的SPI允许的最大fsck为18MHz,设置分频系数时注意不要超过这个数。
3.I2S的输出频率
音频的采样频率可以是96kHz、48kHz、44.1kHz、32kHz、22.05kHz、16kHz、11.025kHz或者8kHz(或任何此范围内的数值)。为了获得需要的频率,需按照以下公式设置线性分频器:
1)当需要生成主时钟时(寄存器SPI_I2SPR的MCKOE位为1):
①声道的帧长为16位,Fs = I2SxCLK/ [(16*2) * ((2*I2SDIV) + ODD)*8]
②声道的帧长为32位,Fs =I2SxCLK / [(32*2) * ((2*I2SDIV) + ODD)*4]
2)当关闭主时钟时(MCKOE位为0):
①声道的帧长为16位,Fs =I2SxCLK / [(16*2) * ((2*I2SDIV) + ODD)]
②声道的帧长为32位,Fs =I2SxCLK / [(32*2) * ((2*I2SDIV) + ODD)]
I2SDIV、ODD由寄存器SPI-I2SPR的第[7:0]位和第8位设置。
3.使用SPI,I2S传送数据时,注意时序,否则数据可能会变成一段一段的。
4.在调试过程中,更改数据(右移一位,相当于音量减半)再次播放则变成了杂音,其原因为原数据设置成了无符号数,实际上是有正负之分的,单纯的右移打乱了数据。
- SPI/I2S调试总结
- SPI,MCP2515调试总结
- 调试SPI总结
- Spi Flash 调试细节总结
- 调试i2s/pcm笔记
- CAN、I2S、I2C、SPI、SSP总线简介
- CAN、I2S、I2C、SPI、SSP总线简介
- CAN、I2S、I2C、SPI、SSP总线简介
- CAN、I2S、I2C、SPI、SSP总线简介
- CAN、I2S、I2C、SPI、SSP总线简介
- CAN、I2S、I2C、SPI、SSP总线简介
- CAN I2C I2S SPI SSP总线简介
- CAN、I2S、I2C、SPI、SSP总线简介
- CAN、I2S、I2C、SPI、SSP总线对比
- CAN 、I2S、I2C、SPI 、SSP总线简介
- Linux中SPI驱动调试总结
- 记一次I2S调试经历
- SPI调试
- EBS常用配置文件设置
- oracle--11.使用DML处理数据
- windows下忘记mysql密码,跳过登录进入mysql解决方案
- python3第一课
- 21天记完托福单词打卡
- SPI/I2S调试总结
- windows 7安装openssl-1.0.2n.tar.gz
- Springboot 打包跳过测试
- 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
- Elasticsearch5-启动检查(Bootstrap Checks)
- Android mListView.getChildCount()和mAdapter.getCount()的区别
- oracle--12.事务
- Android工具类-权限工具类
- Linux之安装CentOS