STM32F103 HAL 字节读写eeprom

#include <AT24C02.h>
#include <i2c.h>
#include <string.h>
#include <usart.h>
#include <tim.h>
//第一个参数 起始地址 第二个参数 写入的数组 第三个参数 数据长度
void WriteDataToAT24C02(uint16_t addr,uint8_t *writbuffer,uint16_t DataSize)
{
	if (addr > 255 || DataSize == 0) //无效数据处理
		{
//        HAL_UART_Transmit(&huart1,"read addr error\r\n",strlen(" read addr error\r\n"),0xFFFF);
    }

    // 写入指定长读=度数据到AT24C02
    for (uint16_t i = 0; i < DataSize; i++) 
		{ //iic句柄, 写地址0xA0, 从机寄存器地址,  从机寄存器地址长度,发送数据的起始地址,发送数据的大小(byte),操作时间
        if (HAL_I2C_Mem_Write(&hi2c2, AT24C02_ADDR_WRITE, addr + i, I2C_MEMADD_SIZE_8BIT, writbuffer + i, 1, 1000) != HAL_OK) 
					{
//             HAL_UART_Transmit(&huart1,"EEPROM write fail\r\n",strlen("EEPROM write fail\r\n"),0xFFFF);
					}
        delay_us(10000);  // AT24C02内部写数据最大5ms就行 因此这个延时大于5ms即可 ms级延时直接用hal库的delay
    }

}

void ReadDataFromAT24C02(uint16_t addr, uint8_t *readbuffer, uint16_t DataSize)
{
	if(addr > 255 || DataSize == 0)//无效数据处理
	{
//		HAL_UART_Transmit(&huart1,"write addr error\r\n",strlen(" write addr error\r\n"),0xFFFF);
	}
	 if (HAL_I2C_Mem_Read(&hi2c2, AT24C02_ADDR_READ, addr, I2C_MEMADD_SIZE_8BIT, readbuffer, DataSize, 1000) != HAL_OK) 
		 {
        // 处理读取失败
//        HAL_UART_Transmit(&huart1,"EEPROM read fail\r\n",strlen("EEPROM read fail\r\n"),0xFFFF);
			}
}

delay_us()很重要 要给iic操作的时间 AT24C02数据手册里边有 应该是5ms左右 本代码delay函数是自己用timer写的 做项目的时候遇到了一点问题 HAL_Delay()这个函数 用在串口中断还是iic中会卡死 具体是哪个记不太清楚了 有空解决一下 

另外 插入一张iic读eeprom(eeprom器件地址 000  要读的内部地址addr0-3  数据 0x11 0x22 0x33 0x44 )的时序图 ,由于示波器太老了 我不会导出图片 我自己画了一个。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值