OpenEdv-开源电子网

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

请教一个关于SPI-DMA的问题

[复制链接]

9

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-11-6
在线时间
14 小时
发表于 2020-11-13 08:28:40 | 显示全部楼层 |阅读模式
1金钱
应用:
STM32F407、SPI做从机接收数据(20MHz时钟)、采用DMA接收,预期 接收到512个数据时产生一个DMA中断,进行数据处理,以下是我的代码,进不了中断,不知道为什么???求解答:
将中断改为SPI1_IRQn时可以进中断,但是数据不对,得到的是一个16位的固定置!
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef  DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

SPI_Cmd(FPGA_SPI, DISABLE);
  SPI_DeInit(FPGA_SPI);

  RCC_AHB1PeriphClockCmd (FPGA_SPI_SCK_GPIO_CLK | FPGA_SPI_MISO_GPIO_CLK | FPGA_SPI_MOSI_GPIO_CLK | FPGA_CS_GPIO_CLK, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2, ENABLE);

GPIO_PinAFConfig(FPGA_SPI_SCK_GPIO_PORT,FPGA_SPI_SCK_PINSOURCE,FPGA_SPI_SCK_AF);
GPIO_PinAFConfig(FPGA_SPI_MISO_GPIO_PORT,FPGA_SPI_MISO_PINSOURCE,FPGA_SPI_MISO_AF);
GPIO_PinAFConfig(FPGA_SPI_MOSI_GPIO_PORT,FPGA_SPI_MOSI_PINSOURCE,FPGA_SPI_MOSI_AF);
  
  GPIO_InitStructure.GPIO_Pin = FPGA_SPI_SCK_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  
  GPIO_Init(FPGA_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = FPGA_SPI_MISO_PIN;
  GPIO_Init(FPGA_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = FPGA_SPI_MOSI_PIN;
  GPIO_Init(FPGA_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);  

  GPIO_InitStructure.GPIO_Pin = FPGA_CS_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_Init(FPGA_CS_GPIO_PORT, &GPIO_InitStructure);

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  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_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//SPI_NSS_Soft;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(FPGA_SPI, &SPI_InitStructure);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream2_IRQn;//SPI1_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

SPI_DMACmd(FPGA_SPI,SPI_DMAReq_Rx,ENABLE);
SPI_Cmd(FPGA_SPI, ENABLE);

while (DMA_GetCmdStatus(SPI_DMA_STREAM) != DISABLE){}
  DMA_DeInit(SPI_DMA_STREAM);
  DMA_InitStructure.DMA_Channel = SPI_DMA_CHANNEL;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&FPGA_SPI->DR;  
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)spi_rv_buf;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = SPI_RV_SIZE;
  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_High;      

  DMA_Init(SPI_DMA_STREAM, &DMA_InitStructure);
  
  DMA_ITConfig(SPI_DMA_STREAM, DMA_IT_TC, ENABLE);
  DMA_Cmd(SPI_DMA_STREAM, ENABLE);


void DMA2_Stream2_IRQHandler(void){
if(DMA_GetFlagStatus(SPI_DMA_STREAM,DMA_FLAG_TCIF2) == SET)
{
DMA_ClearITPendingBit(SPI_DMA_STREAM,DMA_FLAG_TCIF2);
}
}

最佳答案

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

主机模式下, SPI没有纯RX的状态, 读取数据是要与发送数据一起的, 你再加一个DMA做SPI TX就可以收到数据了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-13 08:28:41 | 显示全部楼层
主机模式下, SPI没有纯RX的状态, 读取数据是要与发送数据一起的, 你再加一个DMA做SPI TX就可以收到数据了
回复

使用道具 举报

9

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-11-6
在线时间
14 小时
 楼主| 发表于 2020-11-16 08:48:57 | 显示全部楼层
edmund1234 发表于 2020-11-13 08:28
主机模式下, SPI没有纯RX的状态, 读取数据是要与发送数据一起的, 你再加一个DMA做SPI TX就可以收到数据 ...

我用的是从机
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-16 10:32:25 | 显示全部楼层

有逻辑分析仪或示波器吗? 有时钟信号吗?
回复

使用道具 举报

9

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-11-6
在线时间
14 小时
 楼主| 发表于 2020-11-16 11:17:19 | 显示全部楼层
edmund1234 发表于 2020-11-16 10:32
有逻辑分析仪或示波器吗? 有时钟信号吗?

数据都正常,
已经找到原因了,不知道怎么回事,在配置的时候CR寄存器的BIT9设置成1了,这一位是外设地址递增模式的设置,现在好了,谢谢
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6521
金钱
6521
注册时间
2018-6-27
在线时间
550 小时
发表于 2020-11-20 09:02:14 | 显示全部楼层
学习学习,学习学习。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 03:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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