找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 853|回复: 4
打印 上一主题 下一主题
收起左侧

求助关于STM32单片机SPI+dma传输数据的问题

[复制链接]
跳转到指定楼层
楼主
ID:905498 发表于 2023-8-23 12:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬好,前面发过一个问题了,现在又来麻烦大家了。
就是用STM32F103单片机驱动24位AD的话,通过硬件SPI,读取数据时是这样的:
//读取24位数据
sum |= (SPI2_ReadWriteByte(0xff) << 16);
sum |= (SPI2_ReadWriteByte(0xff) << 8);
sum |= SPI2_ReadWriteByte(0xff);

if (sum & 0x800000)
        {
                sum += 0xFF000000;
        }
  return (int)sum;

就是通过DMA搬运到缓冲区的话,上述该怎么改写呢?
因为24位分成3个部分通过DMA传进缓冲数组的话,那不是一个数据分成3个部分了
我可以在 if (DMA_GetITStatus(DMAx_FLAG_TC) != RESET) 中将三个部分整合成一个数据,
但是在读取AD数据的时候,我是不是可以直接:
SPI2_ReadWriteByte(0xff) << 16;
SPI2_ReadWriteByte(0xff) << 8;
SPI2_ReadWriteByte(0xff);
去掉sum了
希望各位大佬能够指点指点迷茫的我,谢谢!如思路有误或者有更好的办法请尽情Q我,不胜感激!!!!


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:419968 发表于 2023-8-23 17:42 | 只看该作者
用联合体
union Data
{
        unsigned int  sum;                       
        unsigned char byte[4];               
};
Data.byte[0]=SPI2_ReadWriteByte(0xff);
Data.byte[1]=SPI2_ReadWriteByte(0xff);
Data.byte[2]=SPI2_ReadWriteByte(0xff);
Data.sum 就是读到的数了
回复

使用道具 举报

板凳
ID:905498 发表于 2023-8-23 21:47 | 只看该作者
adject 发表于 2023-8-23 17:42
用联合体
union Data
{

大佬,不是很能明白。
还想i向您请教一个问题,就是:

1、SPI全双工的,当我用SPI2_ReadWriteByte发送命令驱动AD的时候,也会有相应的返回数据通过DMA搬运进缓冲数组,那我在数据处理的时候该怎么舍弃这些没用的数据啊
2、您给的这个例子中,联合体该放在哪个位置呢?ad.h中吗?
还有就是打括号中定义的 sum 并没有调用,为什么Data.sum就是我所需要的一个24位数呢?
感觉和提问的最前边的几行代码好像意义相通呢

恕小生愚钝,还望指点一二,真的非常感谢!
回复

使用道具 举报

地板
ID:744809 发表于 2023-8-24 20:28 | 只看该作者
小可爱u 发表于 2023-8-23 21:47
大佬,不是很能明白。
还想i向您请教一个问题,就是:

联合体是共用内存空间的,只要把数据放进byte数组中,就相当于放进sum了,但是我看你最高位还判断了0x800000是不是1,如果是1还得加0xff00000,这部分就得另外实现了
回复

使用道具 举报

5#
ID:905498 发表于 2023-8-28 08:57 | 只看该作者
123156fsadf 发表于 2023-8-24 20:28
联合体是共用内存空间的,只要把数据放进byte数组中,就相当于放进sum了,但是我看你最高位还判断了0x800 ...

我前几天看了一下用法,是的。理解了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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