简单地将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个时钟,时钟个数翻了一倍。
按照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的区别。 通过这样子修改之后的时序图如下: