OpenEdv-开源电子网

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

求助: STM32 spi dma slave模式能否发送数据?

[复制链接]

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-8-18
在线时间
11 小时
发表于 2016-3-11 10:20:17 | 显示全部楼层 |阅读模式
8金钱
大家好 ,有谁用过STM32 spi dma slave模式发送数据的? 我看了一天都找不到相关的资料,调试也不成功,作为dma从模式时,不知道能不能发送数据给主机,原子哥有搞过吗?

最佳答案

查看完整内容[请看2#楼]

最终我用从机的一个IO管脚给主机的外部中断一个跳变缘信号,告诉主机有数据需要接收,主机就来读取;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-8-18
在线时间
11 小时
 楼主| 发表于 2016-3-11 10:20:18 | 显示全部楼层
xtong533 发表于 2016-9-23 21:23
楼主怎么样了,通信成功了吗 ,我也很感兴趣,求解答

最终我用从机的一个IO管脚给主机的外部中断一个跳变缘信号,告诉主机有数据需要接收,主机就来读取;
回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-8-18
在线时间
11 小时
 楼主| 发表于 2016-3-11 14:11:32 | 显示全部楼层
有谁分享下相关的经验,看法,感激不尽;
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11551
金钱
11551
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-3-11 14:32:53 | 显示全部楼层
SPI从机不能主动发送数据,
必须有人给它提供时钟信号。

此事只能靠协议解决,比如:主机定时巡检,从机像乘客在等公交车。





回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-8-18
在线时间
11 小时
 楼主| 发表于 2016-3-11 16:04:55 | 显示全部楼层
xuande 发表于 2016-3-11 14:32
SPI从机不能主动发送数据,
必须有人给它提供时钟信号。

这个我知道,我用两块STM32 的SPI2进行通讯调试,搞不清楚
我的目的是主机想通过SPI DMA 读取从机的数据;代码如下:

主机代码如下---------------------------------------------------------------------
        SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;               
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;               
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;       
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;               
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       
        SPI_InitStructure.SPI_CRCPolynomial = 7;       
        SPI_Init(SPI2, &SPI_InitStructure);

        SPI_Cmd(SPI2, ENABLE); //使能SPI外设




/* DMA Stream Init*/
      DMA_InitStructure.DMA_Channel = DMA_Chanlx;  
      DMA_InitStructure.DMA_PeripheralBaseAddr = PerilBaseAddr;
      DMA_InitStructure.DMA_Memory0BaseAddr = Memy0BaseAddr;
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
      DMA_InitStructure.DMA_BufferSize = BuffSize;
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
      DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
      DMA_Init(DMA_Streamx, &DMA_InitStructure);       
                       
                       
          NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
                       
                DMA_ITConfig(DMA1_Stream3, DMA_IT_TC, ENABLE);       
                SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Rx,ENABLE);
                DMA_Cmd(DMA1_Stream3, ENABLE);


从机代码如下---------------------------------------------------------------------------------
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;  
        SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;               
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;               
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;               
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;       
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;               
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       
        SPI_InitStructure.SPI_CRCPolynomial = 7;       
        SPI_Init(SPI2, &SPI_InitStructure);  


        SPI_Cmd(SPI2, ENABLE); //使能SPI外设



/* DMA Stream Init*/
      DMA_InitStructure.DMA_Channel = DMA_Chanlx;  
      DMA_InitStructure.DMA_PeripheralBaseAddr = PerilBaseAddr;
      DMA_InitStructure.DMA_Memory0BaseAddr = Memy0BaseAddr;
      DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
      DMA_InitStructure.DMA_BufferSize = BuffSize;
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
      DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
      DMA_Init(DMA_Streamx, &DMA_InitStructure);       
                       
                       
          NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
                       

      DMA_ITConfig(DMA1_Stream4, DMA_IT_TC, ENABLE);
      SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);               
      DMA_Cmd(DMA1_Stream4, ENABLE);
回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-8-18
在线时间
11 小时
 楼主| 发表于 2016-3-11 16:08:42 | 显示全部楼层
xuande 发表于 2016-3-11 14:32
SPI从机不能主动发送数据,
必须有人给它提供时钟信号。

SPI DMA方式,之前我用过,但之前都是作为主机发送数据或者作为从机接收数据。
但这次我想用主机读取从机的数据,也就是相当于从机想通过DMA发送数据给主机,搞了一天都搞不懂;
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11551
金钱
11551
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-3-11 16:12:07 | 显示全部楼层
12345678 发表于 2016-3-11 16:08
SPI DMA方式,之前我用过,但之前都是作为主机发送数据或者作为从机接收数据。
但这次我想用主机读取从 ...


有没有DMA,道理都一样。


回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-8-18
在线时间
11 小时
 楼主| 发表于 2016-3-11 16:21:25 | 显示全部楼层
xuande 发表于 2016-3-11 16:12
有没有DMA,道理都一样。

嗯嗯,谢谢,可到现在,一次通信都没成功过,读取到的数据要么全部是0 ,要么全部是错的
如果有成功一次的话,就好办了。完全不知道 spi dma slave 模式下,怎么设置才能传输给主机
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11551
金钱
11551
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-3-11 16:34:37 | 显示全部楼层

上示波器,
主机频繁发SCK,从机回传固定数据。

回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-8-18
在线时间
11 小时
 楼主| 发表于 2016-3-11 16:39:03 | 显示全部楼层
xuande 发表于 2016-3-11 16:34
上示波器,
主机频繁发SCK,从机回传固定数据。

嗯嗯,谢谢,我试试,我现在就是 从机固定数据回传的,我在琢磨琢磨
回复

使用道具 举报

1

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-9
在线时间
29 小时
发表于 2016-9-23 21:23:15 | 显示全部楼层
12345678 发表于 2016-3-11 16:04
这个我知道,我用两块STM32 的SPI2进行通讯调试,搞不清楚
我的目的是主机想通过SPI DMA 读取从机的数据 ...

楼主怎么样了,通信成功了吗 ,我也很感兴趣,求解答
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 02:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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