STM32H7的硬件IIC+DMA,采用查询法,实现与EEPROM的IIC通讯

本文档详细介绍了如何使用STM32H7的IIC和DMA功能来实现对EEPROM的高效读写操作。代码中包含了IIC初始化、DMA配置以及读写驱动函数,特别指出DMA缓存地址需设置在特定区域。此外,还提供了一个查询函数用于确认EEPROM是否完成数据写入。

        基于STM32H723的硬件IIC+DMA,实现对EEPROM的写入及读取操作,建议配合数据手册区查看代码帮助理解,使用DMA时,注意把DMA设置的缓存地址设置在0x24000000以后的区域,DMA才能够访问。

/**************************************************************************
*EEPROM的IIC驱动初始化,带DMA
*PF0----------------------IIC2_SDA_EEPROM
*PF1----------------------IIC2_SCL_EEPROM
*PF2----------------------WP_EEPROM
*
*
**************************************************************************/
uint8_t IIC_And_DMA_Driver_With_EEPROM_Init(void)
{
	DMA_InitTypeDef DMA_InitStruct;
	
	RCC->AHB4ENR  |= 1 << 5;        //使能GPIOF时钟																												      
	RCC->APB1LENR |= 1 << 22;       //使能I2C2外设时钟
    /*GPIO配置*/
	GPIO_Set(GPIOF,1 << 0,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_LOW,GPIO_PUPD_PU);	//PF0
    GPIO_Set(GPIOF,1 << 1,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_LOW,GPIO_PUPD_PU);	//PF1
    GPIO_Set(GPIOF,1 << 2,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_LOW,GPIO_PUPD_PU);//PF2
    GPIO_AF_Set(GPIOF,0,4);	
    GPIO_AF_Set(GPIOF,1,4);	
    GPIO_Pin_Set(GPIOF,PIN2,0);	
    //I2C 时钟来源默认100M 来自PCLK1
    RCC->APB1LRSTR |= 1 << 22;
    RCC->APB1LRSTR &= ~(1 << 22);	
    I2C2->CR1 |= 0 << 0;
    I2C2->TIMINGR = 0x20601138 & 0xF0FFFFFF;
    //此处将IIC的时钟频率设置为400K,如果要设置为100K,则推荐0x20601138,具体配置方法可查数据手册
    I2C2->CR2 |= ((0xA0 >> 1) & 0x7F) << 1;//这里设置的IIC从机的地址
    I2C2->CR2 |= 1 << 10;
    I2C2->OAR1 = ((0 << 15) | (0));						//失能自身地址1 自身地址设为0 
    I2C2->CR2 |= (1 << 15);				//使能NACK,当作为从机时,需要失能NACK			
    I2C2->CR2 &= ~(1 << 25);									//失能AUTOEN
    I2C2->OAR2 = ((0 << 15) | (0) | (0 << 8));//失能自身地址2 自身地址设为0 无屏蔽位
    I2C2->CR1 = ((0 << 19) | (0 << 17));			//失能广播呼叫功能,时钟延长
    I2C2->CR1 |= 1 << 15;											//使能DMA接收请求
    I2C2->CR1 |= 1 << 14;											//使能DMA发送请求
    I2C2->CR1 |= 1 << 0;
    /*以上是IIC的寄存器配置,400K,以下则是DMA的配置,这里我用了自己仿ST标准库实现DMA配置*/
    DMA_InitStruct.u32DMA_NumberData = 0;		
    DMA_InitStruct.u32DMA_Memory1BaseAddr=(uint32_t)u8IIC_DMA_Transmit_For_EEPROM_Buffer;			    
    //DMA存储器地址		
    DMA_Init
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉心客丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值