我们从2011年坚守至今,只想做纯粹的技术论坛,请不要发布和技术无关的话题。  本站有两万多份高大上的PCB和原理图下载,每日更新中,欢迎常回来看看

 找回密码
 立即注册
搜索
查看: 2398|回复: 10

[技术文章] STM32F4XX的I2C下的DMA控制代码

[复制链接]

6

主题

5

回帖

14

积分

一级逆天

积分
14

社区居民终身成就奖

QQ
发表于 2018-11-26 08:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#include <stm32f4xx.h>  

#define IICRx_COUNTER 3 //I2C DMA接收数据(主机写)字节数,u16step + u8dirspd
#define IICTx_COUNTER 8 //I2C DMA发送数据(主机读)字节数,u8temp + u16yrstep + u16zrstep + u16arstep + u8temp,第一个temp为了避开DMA首字节缓冲,最后一个temp为了配合CH341的多一个数据

u8 IIC_ADDRESS; //确定IO口后再做硬件地址

volatile u8 IIC_DMA_RxBuf[3] = {0,0,0};
volatile u8 IIC_DMA_TxBuf[8] = {0,0,0,0,0,0,0,0};

/*
typedef struct
{
    volatile u32 temp;              //本次行程中步数计数器
    volatile u32 step;              //本次行程总步数(长行程轴步数)
    volatile u32 add;               //加速点
    volatile u32 dect;              //减速点
    volatile u32 timerload;        //保存计算延时值
    volatile float timer;           //计算曲线中间变量
        volatile u16* backtemp;         //剩余步数
}sMotor;

sMotor MotorY;
sMotor MotorZ;
sMotor MotorA;

MotorY.backtemp = (u16*)(&IIC_DMA_TxBuf[1]);
MotorZ.backtemp = (u16*)(&IIC_DMA_TxBuf[3]);
MotorA.backtemp = (u16*)(&IIC_DMA_TxBuf[5]);

//使用原MotorP.backtemp成员变量时,改为 (* MotorY.backtemp)

*/

void IIC_GET_ADDRESS()
{
  //使能GPIO时钟
  //配置GPIO为输入
  //读IO,得到硬件IIC地址
  IIC_ADDRESS = 0x36; //
}

void IIC_DMA_INIT()
{
  IIC_GET_ADDRESS();
  
  RCC->AHB1ENR |= RCC_AHB1RSTR_DMA1RST; //使能DMA1时钟

  //IIC DMA 从机接收 (主机写)  
  DMA1_Stream0->CR &= ~DMA_SxCR_EN; //除能DMA1_Stream0  
  while(DMA1_Stream0->CR & DMA_SxCR_EN);//确保DMA可以被设置  
  DMA1->LIFCR |= (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0);//传送前清空DMA1_Stream0所有中断标志  
  DMA1_Stream0-&gtAR = (uint32_t)&I2C1->DR  ;//设置外设地址I2C1->DR地址
  DMA1_Stream0->M0AR = (uint32_t)IIC_DMA_RxBuf; //设置内存地址  
  DMA1_Stream0->NDTR = IICRx_COUNTER; //设置dma传输数据的数量  
  DMA1_Stream0->CR |= (DMA_SxCR_CHSEL_0 | DMA_SxCR_PL_0 | DMA_SxCR_MINC | DMA_SxCR_CIRC); //设置通道号1,优先级中级,传输方向外设到内存(0不用设),内存递增
  DMA1_Stream0->CR |= DMA_SxCR_EN; //开启DMA
  
  //IIC DMA 从机发送  (主机读)
  DMA1_Stream6->CR &= ~DMA_SxCR_EN; //除能DMA1_Stream6  
  while(DMA1_Stream6->CR & DMA_SxCR_EN);//确保DMA可以被设置  
  DMA1->HIFCR |= (DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5);;//传送前清空DMA1_Stream6所有中断标志  
  DMA1_Stream6-&gtAR = (uint32_t)&I2C1->DR  ;//设置外设地址I2C1->DR地址
  DMA1_Stream6->M0AR = (uint32_t)IIC_DMA_TxBuf; //设置内存地址  
  DMA1_Stream6->NDTR = IICTx_COUNTER; //设置dma传输数据的数量  
  DMA1_Stream6->CR |= ( DMA_SxCR_CHSEL_0 | DMA_SxCR_PL_0 | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_CIRC);//设置通道号1,优先级中级,传输方向内存到外设,内存递增
  DMA1_Stream6->CR |= DMA_SxCR_EN;
  
  
  RCC->AHB1ENR |= RCC_AHB1RSTR_GPIOBRST;    //使能GPIOB时钟  
  
  GPIOB->AFR[0] &= ~0xFF000000;   //设置PB6 7复用IIC模式
  GPIOB->AFR[0] |= 0x44000000;    //设置PB6 7复用IIC模式
  GPIOB->MODER &= ~(GPIO_MODER_MODER6 | GPIO_MODER_MODER7); //设置PB6、7为复用模式
  GPIOB->MODER |= (GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1);
  GPIOB->OTYPER |= (GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7);//设置PB6、7为开漏输出
  GPIOB->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7);     //设置PB6、7速度50M
  GPIOB->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR6_1 | GPIO_OSPEEDER_OSPEEDR7_1);  //设置PB6、7速度50M
  GPIOB-&gtUPDR &= ~(GPIO_PUPDR_PUPDR6 | GPIO_PUPDR_PUPDR7);    //设置PB6 7 上拉
  GPIOB-&gtUPDR |= (GPIO_PUPDR_PUPDR6_0 | GPIO_PUPDR_PUPDR7_0); //设置PB6 7 上拉

  
  RCC->APB1ENR |= RCC_APB1RSTR_I2C1RST; //开启IIC1时钟
  
  I2C1->CR1 |= (I2C_CR1_PE | I2C_CR1_ACK);  //启用IIC2模块,并设置应答位
  I2C1->CR1 &= ~I2C_CR1_SMBUS; //设置为IIC模式
  I2C1->OAR1 &= ~I2C_OAR1_ADDMODE; //设置为7位地址模式
  I2C1->OAR1 |= 0x4000; //手册上说改为需要由软件置1
  I2C1->OAR1 |= IIC_ADDRESS; //设置地址
  //I2C1->OAR2 = (IIC_ADDRESS_2 | 0x01); //设置地址并启用双地址
  I2C1->CR2 |= (I2C_CR2_DMAEN);
  I2C1->CR1 |= I2C_CR1_NOSTRETCH;
}
发表于 2018-11-26 08:57 | 显示全部楼层
回复

使用道具 举报

1

主题

666

回帖

228

积分

二级逆天

积分
228

社区居民终身成就奖优秀斑竹奖

QQ
发表于 2018-11-26 09:22 | 显示全部楼层
回复

使用道具 举报

0

主题

135

回帖

47

积分

一级逆天

积分
47

终身成就奖

QQ
发表于 2018-11-26 09:28 | 显示全部楼层
回复

使用道具 举报

5

主题

1033

回帖

903

积分

1元学习Allegro(1期)

积分
903

终身成就奖优秀斑竹奖

QQ
发表于 2018-11-26 10:15 | 显示全部楼层
回复

使用道具 举报

6

主题

19

回帖

19

积分

一级逆天

积分
19

终身成就奖

QQ
发表于 2018-11-26 12:14 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:常住青年
  • 打卡总天数:17
  • 打卡月天数:0
  • 打卡总奖励:61
  • 最近打卡:2025-01-13 19:11:02

0

主题

8150

回帖

7628

积分

二级逆天

积分
7628

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2018-11-26 17:16 | 显示全部楼层
回复

使用道具 举报

发表于 2018-11-29 07:05 | 显示全部楼层
回复

使用道具 举报

发表于 2018-12-2 15:37 | 显示全部楼层
回复

使用道具 举报

18

主题

219

回帖

331

积分

二级逆天

积分
331

终身成就奖

发表于 2018-12-3 12:58 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请举报投诉

本站所有资料仅限参考学习交流,PCB原理图源码等所有资料不保证准确没问题,请不要用作生产。否则后果自负。

闽公网安备35062302000276号 | 闽ICP备2024076463号-1 | 论坛技术支持QQ群171867948 | 论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表