OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3906|回复: 5

SPI单工时如何判断数据已经发送完成

[复制链接]

9

主题

46

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1131
金钱
1131
注册时间
2016-11-9
在线时间
97 小时
发表于 2022-4-11 16:48:55 | 显示全部楼层 |阅读模式
(1)SPI双工时对读写函数的理解:

(2)单工时读写函数的修改:延时的方法

(3)不能用TXE的原因:

参考链接:https://blog.csdn.net/weixin_39450612/article/details/106056434
(4)使用延时的方法可以,DMA方式没有使用。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

46

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1131
金钱
1131
注册时间
2016-11-9
在线时间
97 小时
 楼主| 发表于 2022-4-11 16:50:53 | 显示全部楼层
(2)单工时的发送函数:
void SPI1_ReadWriteByte(u8 TxData)
{                                        
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //检查指定的SPI标志位设置与否:发送缓存空标志位                  
        SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
        delay();
}
回复 支持 反对

使用道具 举报

9

主题

46

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1131
金钱
1131
注册时间
2016-11-9
在线时间
97 小时
 楼主| 发表于 2022-4-11 16:52:18 | 显示全部楼层
本帖最后由 学习阶段 于 2022-4-12 10:16 编辑

不能删帖子吗
回复 支持 反对

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2070
金钱
2070
注册时间
2021-7-17
在线时间
647 小时
发表于 2022-4-11 17:32:11 | 显示全部楼层
学习学习  
回复 支持 反对

使用道具 举报

9

主题

46

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1131
金钱
1131
注册时间
2016-11-9
在线时间
97 小时
 楼主| 发表于 2022-4-11 18:36:52 | 显示全部楼层
本帖最后由 学习阶段 于 2022-4-12 09:18 编辑

我这个代码实际不是在F1上运行的,是在STM32L431上运行的。从STM32L071向L431移植时遇到的问题。
硬件都是使用SPI2的MOSI驱动LCD,MISO做LCD_RST使用的。
STM32L071 不设置SP2->CR1的bit14(BIDIOE)和bit15(BIDIMODE) SPI2->SR的RXNE会置位Full-Duplex Master
STM32L071 设置SP2->CR1的bit14(BIDIOE)和bit15(BIDIMODE) SPI2->SR的RXNE不会置位Half-Duplex Master
STM32L431 不设置SP2->CR1的bit14(BIDIOE)和bit15(BIDIMODE) SPI2->SR的RXNE会置位 Full-Duplex Master
STM32L431 设置SP2->CR1的bit14(BIDIOE)和bit15(BIDIMODE) SPI2->SR的 RXNE不会置位Half-Duplex Master
无论配置成Full-Duplex Master还是Half-Duplex Maste,SPI2->CR1的bit10(RXONLY)都是0,为什么没有使用MISO这条线,RXNE还会置位呢?不明白。
回复 支持 反对

使用道具 举报

9

主题

46

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1131
金钱
1131
注册时间
2016-11-9
在线时间
97 小时
 楼主| 发表于 2022-4-11 18:42:54 | 显示全部楼层
本帖最后由 学习阶段 于 2022-4-12 11:35 编辑

最后用的这个发送函数,但是RXNE标志的问题还是没明白。
uint8_t l_spi2_readWriteByte(uint8_t Data)
{
         while(!LL_SPI_IsActiveFlag_TXE(SPI2));  //等待发送缓冲区空
        LL_SPI_TransmitData8(SPI2, Data);       //发送8位数据
        while(LL_SPI_IsActiveFlag_BSY(SPI2));  //SPI2->SR & 0x80 等待数据发送完成
        return 0;
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 14:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表