硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1054|回复: 4
收起左侧

[SPI/QSPI] HAL库中SPI发送代码的一处疑问

[复制链接]

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2024-10-26 05:57:26 | 显示全部楼层 |阅读模式
本帖最后由 zchong 于 2024-10-26 20:15 编辑

以HAL库中SPI的发送函数中8bit模式举例,具体代码如下

[C] 纯文本查看 复制代码
      /* Wait until TXP flag is set to send data */
      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP))
      {
        if ((hspi->TxXferCount > 3UL) && (hspi->Init.FifoThreshold > SPI_FIFO_THRESHOLD_03DATA))
        {
          *((__IO uint32_t *)&hspi->Instance->TXDR) = *((uint32_t *)hspi->pTxBuffPtr);
          hspi->pTxBuffPtr += sizeof(uint32_t);
          hspi->TxXferCount -= (uint16_t)4UL;
        }
        else if ((hspi->TxXferCount > 1UL) && (hspi->Init.FifoThreshold > SPI_FIFO_THRESHOLD_01DATA))
        {
#if defined (__GNUC__)
          *ptxdr_16bits = *((uint16_t *)hspi->pTxBuffPtr);
#else
          *((__IO uint16_t *)&hspi->Instance->TXDR) = *((uint16_t *)hspi->pTxBuffPtr);
#endif /* __GNUC__ */
          hspi->pTxBuffPtr += sizeof(uint16_t);
          hspi->TxXferCount -= (uint16_t)2UL;
        }
        else
        {
          *((__IO uint8_t *)&hspi->Instance->TXDR) = *((uint8_t *)hspi->pTxBuffPtr);
          hspi->pTxBuffPtr += sizeof(uint8_t);
          hspi->TxXferCount--;
        }
      }

问题如下:
从代码看,只要fifo空间够就可以塞数据进去,如果数据塞多了会怎么样?
举个例子,假如要发三个字节,但是我写入的时候按照32bit写入一个数据,这个时候spi会发出多少数据?和TSIZE,还有FTHVL是否有关联?





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-26 09:25:30 | 显示全部楼层
楼主的问题好像还没有贴上。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2024-10-26 20:20:01 | 显示全部楼层
eric2013 发表于 2024-10-26 09:25
楼主的问题好像还没有贴上。

已经补上了,最近在研究AD5679的驱动,像节约一些时间,还没有头绪。这个DAC内部是16路模拟量输出,每路的设置需要24bit数据,设置过程是这样的先拉低片选,发送一个通道的24bit数据,再拉高片选,如此反复,直到16个通道设置完成,有没有比较节约时间的做法?
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2024-10-27 07:51:32 | 显示全部楼层
eric2013 发表于 2024-10-26 09:25
楼主的问题好像还没有贴上。

大神,重新描述一下我的应用需求:
外设的数据帧是24bit的,由于h7部分spi最大只支持到16bit数据帧,因此设置DSIZE为8bit,每个有效片选需要传输3次来实现24bit传输。
现在的问题是,外设是多通道DAC,每个通道都要拉低片选发送24bit数据再拉高片选,这种情况下我想尽可能的缩短SPI发送占用的时间,不知道是否可以使用DMA实现这样的操作?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-27 11:03:34 | 显示全部楼层
zchong 发表于 2024-10-26 20:20
已经补上了,最近在研究AD5679的驱动,像节约一些时间,还没有头绪。这个DAC内部是16路模拟量输出,每路 ...

我们有个DAC8563,也是24bit设计方式,自带两路输出,我用的SPI DMA方式控制的,你可以参考下适合你这个芯片不

第74章
https://forum.anfulai.cn/forum.p ... &extra=page%3D1


回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 17:35 , Processed in 0.038582 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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