STM32F334 SPI编程里的坑

最近在学习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"的要求。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值