STM32L431之SPI时钟翻倍问题

    xiaoxiao2021-03-25  121

    简单地将SPI配置成8位数据长度模式

    /* configure SPI1 */ SPI1->CR2 = 0x1704; SPI1->CR1 = 0x15C;

    读写方式

    GPIOA->BSRR |= 1 << 20; //set NSS low for(i = 0;i < command_size;i++) { while (0 == (SPI1->SR & SPI_SR_TXE)); SPI1->DR = out_buf[i] & 0xFF; while (0 == (SPI1->SR & SPI_SR_RXNE)); in_buf[i] = SPI1->DR & 0xFF; } GPIOA->BSRR |= 1 << 4; //set NSS high

    发现读写的时候时钟翻倍,写入3B有48个clock。而且在NSS拉高之后依然有时钟。 如果数据位配置成4b的话,写入4B依然也有24个时钟,时钟个数翻了一倍。

    原因:SPI有个data packing,如果配置的数据长度小等于8b(即一个字节及以下)并且按照16b模式读写SPIx->DR时自动进行data packing。(详见RM36.4.9 Data packing)

    解决方法

    按照8位的方式进行读写SPIx->DR,即

    GPIOA->BSRR |= 1 << 20; //set NSS low for(i = 0;i < command_size;i++) { while (0 == (SPI1->SR & SPI_SR_TXE)); (unsigned char *)&(SPI1->DR) = out_buf[i] & 0xFF; while (0 == (SPI1->SR & SPI_SR_RXNE)); in_buf[i] = SPI1->DR & 0xFF; } GPIOA->BSRR |= 1 << 4; //set NSS high

    通过反汇编我们可以看到两者的差异: 在最后一句时使用STR及STRB的区别。 通过这样子修改之后的时序图如下:

    转载请注明原文地址: https://ju.6miu.com/read-38917.html

    最新回复(0)