OpenEdv-开源电子网

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

stmH743spi+DMA发送问题,现象十分奇怪,不使用DMA,正常spi读写没有问题

[复制链接]

5

主题

8

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-3-24
在线时间
13 小时
发表于 2020-3-26 16:10:17 | 显示全部楼层 |阅读模式
1金钱
每次第一次开始传输不成功,第二次传输成功,并把第一次的数据个一并传输了,但是数据是错误的,比如,第一次传输00 11没有成功,第二次传输22 33 ,会传输4个字节的数据,但数据不是00 11 22 33,而是其他数据

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-27 01:10:13 | 显示全部楼层
回复

使用道具 举报

5

主题

8

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-3-24
在线时间
13 小时
 楼主| 发表于 2020-3-27 10:10:54 | 显示全部楼层
  1. void SPI_Configuration(void)
  2. {
  3.         RCC->AHB4ENR|=1<<4;                    //使能PORTE时钟
  4.         RCC->APB2ENR|=1<<13;                    //使能SPI4时钟
  5.        
  6.         RCC->AHB1ENR|=1<<0;                                //DMA1时钟使能
  7. //        RCC->D3AMR|=1<<0;                                //DMAMUX时钟使能
  8.        
  9.         GPIO_Set(GPIOE,PIN2,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PD);        //PE2 SCK  复用推挽输出
  10.         GPIO_Set(GPIOE,PIN6,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PD);        //PE6 MOSI 复用推挽输出
  11.         GPIO_Set(GPIOE,PIN5,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_HIGH,GPIO_PUPD_PU);        //PE5 MISO 复用开漏输出
  12.         GPIO_Set(GPIOE,PIN4,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);        //PE4 上拉输出
  13.        
  14.         GPIO_AF_Set(GPIOE,2,5);    //PE2-AF5
  15.         GPIO_AF_Set(GPIOE,6,5);    //PE6-AF5
  16.         GPIO_AF_Set(GPIOE,5,5);    //PE5-AF5
  17.        
  18.         //SPI4配置
  19.         /* 波特率配置 */
  20.         SPI4->CFG1 &=~(0X07<<28);  
  21.         SPI4->CFG1 |=(0X01<<28);   //SPI时钟/2
  22.         //通信模式
  23.         SPI4->CFG2 &= ~(0x03<<17); //全双工
  24.         //时钟相位 CPHA
  25.         SPI4->CFG2 &=~(1<<24); //从第1个时钟边沿采样数据
  26.         //时钟极性 CPOL
  27.         SPI4->CFG2 &=~(1<<25); //空闲时SCK信号为低电平
  28.         //数据格式
  29.         SPI4->CFG1 |= 0x07; //8位数据格式
  30.         //数据帧格式
  31.         SPI4->CFG2 &=~(1<<23); //先发送MSB
  32.         //串行协议
  33.         SPI4->CFG2 &=~(3<<19);  //SPI Motorola
  34.         //CRC计算
  35.         SPI4->CFG1 &=~(1<<22); //禁止CRC使能
  36.         //CRC处理长度
  37.         SPI4->CFG1 |= (7<<16); //8位CRC
  38.         //SS信号输入软件管理
  39.         SPI4->CFG2 |=(1<<26); // SSM SS输入值由SSI值决定
  40.         SPI4->CR1 |=(1<<12); // SSI
  41.         //SSOM 主模式输出管理
  42.         SPI4->CFG2 &=~(1<<30);
  43.         //复用功能GPIO控制
  44.         SPI4->CFG2 |=(1<<31);
  45.         //SPI模式
  46.         SPI4->CFG2 |= (1<<22); //主模式
  47.        
  48.         SPI4->CFG1 |= (1<<15); //使能DMA_TX
  49.        
  50.        
  51. //        SPI4_ReadWriteByte(0xff);        //启动传输       
  52.        
  53.         //DMA配置
  54.         while(DMA1_Stream2->CR&0X01);        //等待DMA1可配置  
  55.         DMAMUX1_Channel2->CCR=84;                //DMA1_stream2的通道选择: 84,即SPI4_Tx对应的通道
  56.                                                                         //详见<<STM32H7xx参考手册>>16.3.2节,Table 116
  57.        
  58.         DMA1->LIFCR|=0X3D<<16;                        //清空通道2上所有中断标志
  59.         DMA1_Stream2->FCR=0X0000021;        //设置为默认值       
  60.        
  61.         DMA1_Stream2->PAR=(uint32_t)(&SPI4->TXDR);                //DMA外设地址
  62.         DMA1_Stream2->M0AR=(uint32_t)Tx_Buffer;                //DMA 存储器0地址
  63.         DMA1_Stream2->NDTR = 2048;    //DMA传输数据量
  64.         DMA1_Stream2->CR=0;                        //先全部复位CR寄存器值
  65.         DMA1_Stream2->CR &= ~(1<<0);    //禁止数据流
  66.         DMA1_Stream2->CR|=1<<6;                //存储器到外设模式
  67.         DMA1_Stream2->CR|=0<<8;                //非循环模式(即使用普通模式)
  68.         DMA1_Stream2->CR|=0<<9;                //外设非增量模式
  69.         DMA1_Stream2->CR|=1<<10;                //存储器增量模式
  70.         DMA1_Stream2->CR|=0<<11;                //外设数据长度:8位
  71.         DMA1_Stream2->CR|=0<<13;                //存储器数据长度:8位
  72.         DMA1_Stream2->CR|=2<<16;                //高优先级
  73.         DMA1_Stream2->CR|=0<<21;                //外设突发单次传输
  74.         DMA1_Stream2->CR|=0<<23;                //存储器突发单次传输
  75. //        DMA1_Stream2->FCR |= 1<<2;  //禁止直接模式
  76. //        DMA1_Stream2->FCR |= 3<<0;  //FIFO完整容量
  77.         DMA1_Stream2->CR|=1<<4;                //使能TC中断
  78. //        DMA1_Stream2->CR |= 1<<0;    //使能数据流

  79.         SPI4->CR1 |=(1<<0); // 使能SPI4
  80.        
  81. }
复制代码


这初始化的问题在哪,改了好久了
回复

使用道具 举报

5

主题

8

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-3-24
在线时间
13 小时
 楼主| 发表于 2020-3-27 16:38:09 | 显示全部楼层
自己顶一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-28 00:46:34 | 显示全部楼层
Syl丶 发表于 2020-3-27 10:10
这初始化的问题在哪,改了好久了

你的读写是怎么处理的?
我建议发送指令,地址这些就别用DMA,数据传输的时候
才使用DMA
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

8

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-3-24
在线时间
13 小时
 楼主| 发表于 2020-3-28 13:36:48 | 显示全部楼层
本帖最后由 Syl丶 于 2020-3-28 13:39 编辑

w5500,只有数据是通过DMA发送的,指令,地址就是通过正常的读写,在线查看相关的DMA通道寄存器,第一次使能后,DMA并没有中断,第二次传输数据时,NDTR寄存器个数显示为6,但是发出来的数据为12个,相当于把第一次的6个数据一起发上来了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-3 06:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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