最近在学习STM32F334的编程,在编写用SPI驱动LCD液晶屏时有一个奇怪的问题,采用HAL库中的函数就正常显示
HAL_SPI_Transmit(&hspi1, &dat, 1, 10);
直接写寄存器就怎么也不成功。
while (__HAL_SPI_GET_FLAG(&hspi1, SPI_FLAG_TXE)==0);
hspi1.Instance->DR=dat;
百思不得其解,然后看数据手册,发现有这一段:
就是说如果传输的字节刚好是1个的话,SPI就自动进行“打包传输”,就是一次传输2个字节,如果只想传输单个字节的话,就只能向寄存器写入一个字。
这样的操作是不行的:
hspi1.Instance->DR=dat;
虽然dat的类型是uint8_t, 但在赋值时被自动转为uint16_t, 这样本来只想发送一个字节的,变成了发送两个字节,当然会出错。
正确的赋值方法:
*((__IO uint8_t *)&hspi1.Instance->DR)=dat;
刚开始在库函数中看到这样的赋值方法不理解,看了数据表后才明白,这是强制把DR寄存器的指针类型改为uint8_t, 达到“8 bits access"的要求。