查看: 3467|回复: 4

[求助] 求助!K60 DMA传输内存数据到SPI数据寄存器的问题!

[复制链接]

该用户从未签到

21

主题

62

帖子

0

中级会员

Rank: 3Rank: 3

积分
330
最后登录
1970-1-1
发表于 2015-1-21 09:41:14 | 显示全部楼层 |阅读模式
      各位大神,我现在想通过DMA将数据传输到K60的SPI的数据寄存器,我是通过SPI的TFFF标志触发DMA的,源地址为一个数组,目的地址为SPI0的数据寄存器。      
      K60的SPI0的数据寄存器PUSHR在发送的时候只能发送16位,前面还要加上命令(拉低哪一根片选等等),我在测试的时候发现DMA已经被触发(使用SPI0的发送作为触发源,将数组A的数据搬运到另一个数组B,打印数组B,发现B内容改变,证明DMA被触发),但是从数组传输到SPI0的数据寄存器一直发送不过去,我在想是不是因为在向数据寄存器PUSHR写数据时需要带上高16字节的命令所以导致主机没有拉低从机的片选(DMA在搬运数据是没有拉低片选),我又进行测试,发现如果先写入PUSHR寄存器拉低片选的话(PUSHR寄存器pcs[5:0]第0位置1,表明pcs0有效),就会发送了一组空数据过去,再将数据写搭到PUSHR寄存器(PUSHR寄存器txdata)就会触​发数据发送,导致每次多发一组空数据想请教下使用DMA的话如何先拉低片选再进行DMA的数据传输,才能保证数据全部被发送出去?





我知道答案 目前已有4人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2015-1-21 15:56:13 | 显示全部楼层
    楼主DMA的配置代码发一下吧。包括SPI的配置。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    21

    主题

    62

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    330
    最后登录
    1970-1-1
     楼主| 发表于 2015-1-21 17:24:33 | 显示全部楼层
    本帖最后由 冰水混合物-347708 于 2015-1-21 17:26 编辑
    安 发表于 2015-1-21 15:56
    楼主DMA的配置代码发一下吧。包括SPI的配置。

    谢谢安,本来还想着@你的,苦于论坛没有这个功能,没想到你看到我的帖子了~问题刚刚已经解决,原来在发送的时候需要将命令字段(16字节)和数据字段(16字节)融合在一起发送,比如说数据字节是0x1234,命令字节0x8001,那么需要发送的数据为0x8001_1234~
    这是我的配置:
            //DMA0初始化
            DMA_InitTypeDef dma0_init_struct;
            //DMA参数配置
            dma0_init_struct.DMA_CHx = DMA_CH0;                                   //CH0通道
            dma0_init_struct.DMA_Req = SPI0_TRAN_DMAREQ;                //SPI0_TRAN_DMAREQ为触发源
            dma0_init_struct.DMA_MajorLoopCnt = 24;                                //主循环计数值
            dma0_init_struct.DMA_MinorByteCnt = 4;                                //次循环传输的字节数
            dma0_init_struct.DMA_SourceAddr = (uint32_t)info;        //源地址
            dma0_init_struct.DMA_SourceAddrOffset = 4;                        //源地址偏移:每次读入增加n字节
            dma0_init_struct.DMA_SourceDataSize = DMA_SRC_32BIT;//源地址数据宽度
            dma0_init_struct.DMA_LastSourceAddrAdj = 0;                        //配置源数据地址在主循环完成后的调整量
            dma0_init_struct.DMA_DestAddr = (uint32_t)&SPI0->PUSHR; //目的地址
            dma0_init_struct.DMA_DestAddrOffset = 0;                        //目的地址偏移:每次读入增加0
            dma0_init_struct.DMA_DestDataSize = DMA_SRC_32BIT;        //目的地址数据宽度
            dma0_init_struct.DMA_LastDestAddrAdj = 0;                        //配置目的数据地址在主循环完成后的调整量
            dma0_init_struct.DMA_AutoDisableReq = TRUE;                        //自动禁用请求
            dma0_init_struct.DMA_Isr = DMA0_Isr;
            dma0_init_struct.DMA_MajorCompleteIntEnable = TRUE;


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2015-1-22 08:45:00 | 显示全部楼层
    嗯。有问题就在论坛留贴,我们会尽快回复。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    26
    最后登录
    1970-1-1
    发表于 2016-2-25 11:50:20 | 显示全部楼层
    冰水混合物-347708 发表于 2015-1-21 17:24
    谢谢安,本来还想着@你的,苦于论坛没有这个功能,没想到你看到我的帖子了~问题刚刚已经解决,原来在发送 ...

    您好,非常感谢您的分享,我最近也在调SPI+DMA,总是调不通,发送不了数据,可不可以请教一下您的SPI是怎么配置的,不胜感激
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 12:41 , Processed in 0.092087 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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