SPI/I2S调试心得与经验总结

一、调试中首先检查SPI使能总线是否正确;

     检查时序(现有时钟,后片选拉低),接收时必须有发送才能有时钟

二、对照flash芯片手册查看SPI时序

三、检查状态位

 

 

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函数,完整函数如下:

 

 
  1. /**

  2. * @brief Configures the FIFO reception threshold forthe selected SPI.

  3. * @param SPIx: where x can be 1 or 2 to select the SPIperipheral.

  4. * @note SPI2 is not available for STM32F031 devices.

  5. * @param SPI_RxFIFOThreshold: specifies the FIFOreception threshold.

  6. * This parameter can be one of thefollowing values:

  7. * @arg SPI_RxFIFOThreshold_HF: RXNEevent is generated if the FIFO

  8. * levelis greater or equal to 1/2.

  9. * @arg SPI_RxFIFOThreshold_QF: RXNEevent is generated if the FIFO

  10. * levelis greater or equal to 1/4.

  11. * @retval None

  12. */

  13. voidSPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold)

  14. {

  15. /* Check the parameters */

  16. assert_param(IS_SPI_ALL_PERIPH(SPIx));

  17. assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold));

  18.  
  19. /* Clear FRXTH bit */

  20. SPIx->CR2 &=(uint16_t)~((uint16_t)SPI_CR2_FRXTH);

  21.  
  22. /* Set new FRXTH bit value*/

  23. SPIx->CR2 |= SPI_RxFIFOThreshold;

  24. }

 

 

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.在调试过程中,更改数据(右移一位,相当于音量减半)再次播放则变成了杂音,其原因为原数据设置成了无符号数,实际上是有正负之分的,单纯的右移打乱了数据。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UART、SPI、I2C(也称为IIC)、IIS(也称为I2S)是一些常见的串行通信接口标准,用于在电子设备之间传输数据。 1. UART(通用异步收发器):UART是一种常见的串行通信接口,用于通过异步方式传输数据。它通常用于连接计算机和外部设备,如调制解调器、GPS模块、传感器等。UART使用TX(发送)和RX(接收)线来进行数据传输。 2. SPI(串行外围接口):SPI是一种全双工的串行通信接口,用于在微控制器和外部设备之间传输数据。SPI使用主从模式,其中一个设备充当主设备,控制通信的时序和数据传输。它使用多个线(如SCLK、MISO、MOSI)进行通信,并支持高速数据传输。 3. I2C(双线串行接口):I2C是一种双线制的串行通信接口,用于在芯片之间进行通信。它使用两根线(SDA和SCL)进行数据和时钟传输。I2C支持多主从模式,允许多个设备在同一总线上进行通信。 4. IIS(集成电路音频总线)/I2S(Inter-IC Sound):IIS或I2S是一种用于音频数据传输的串行接口。它通常用于数字音频设备之间的连接,如音频编解码器、数字信号处理器等。I2S使用多个线(如数据线、时钟线、帧同步线)来传输音频数据。 这些接口标准在电子设备中广泛应用,每种接口都有其独特的特点和应用场景。具体使用哪种接口取决于设备之间的通信需求和硬件支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值