我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

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

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

[复制链接]

该用户从未签到

6

主题

5

回帖

2

积分

一级逆天

积分
2

社区居民终身成就奖

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

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

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

×
#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;
}
回复

使用道具 举报

该用户从未签到

12

主题

298

回帖

0

积分

1元学习PADS(5期)

积分
0

终身成就奖

QQ
发表于 2018-11-26 08:57:35 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

1

主题

892

回帖

217

积分

二级逆天

积分
217

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

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

使用道具 举报

该用户从未签到

0

主题

204

回帖

0

积分

一级逆天

积分
0

终身成就奖

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

使用道具 举报

该用户从未签到

5

主题

1480

回帖

897

积分

1元学习Allegro(1期)

积分
897

终身成就奖优秀斑竹奖

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

使用道具 举报

该用户从未签到

6

主题

23

回帖

0

积分

一级逆天

积分
0

终身成就奖

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

使用道具 举报

  • TA的每日心情
    慵懒
    2024-6-14 16:03
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    0

    主题

    1万

    回帖

    7618

    积分

    二级逆天

    积分
    7618

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

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

    使用道具 举报

    该用户从未签到

    82

    主题

    2953

    回帖

    4788

    积分

    PADS-190220高级班

    积分
    4788

    终身成就奖原创先锋奖优秀斑竹奖

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

    使用道具 举报

    该用户从未签到

    82

    主题

    2953

    回帖

    4788

    积分

    PADS-190220高级班

    积分
    4788

    终身成就奖原创先锋奖优秀斑竹奖

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

    使用道具 举报

    该用户从未签到

    18

    主题

    277

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

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

    使用道具 举报

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

    本版积分规则

    每日签到,有金币领取。


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

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

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

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