/*------------------------------------------------头文件区------------------------------------------------*/
#include "app_eeprom.h"
/*------------------------------------------------宏定义区------------------------------------------------*/
/*主设备地址*/
#define EEPROM_MASTER_ADDRESS 0x72
/*从设备地址*/
#define EEPROM_SLAVE_ADDRESS 0xA0
/*读写地址*/
#define EEPROM_RW_ADDRESS 0x00
/*-----------------------------------------------类型定义区-----------------------------------------------*/
/*---------------------------------------------静态函数声明区---------------------------------------------*/
/*---------------------------------------------全局变量定义区---------------------------------------------*/
/*-----------------------------------------------函数实现区-----------------------------------------------*/
/*eeprom初始化*/
void app_eeprom_init(void)
{
/* enable GPIOB clock */
rcu_periph_clock_enable(RCU_GPIOB);
/* enable I2C1 clock */
rcu_periph_clock_enable(RCU_I2C1);
/* I2C1 GPIO ports */
/* connect PB10 to I2C1_SCL */
/* connect PB11 to I2C1_SDA */
gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11);
/* I2C clock configure */
i2c_clock_config(I2C1, 100000, I2C_DTCY_2);
/* I2C address configure */
i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, EEPROM_MASTER_ADDRESS);
/* enable I2C1 */
i2c_enable(I2C1);
/* enable acknowledge */
i2c_ack_config(I2C1, I2C_ACK_ENABLE);
}
/*向eeprom写入数据*/
bool app_eeprom_write(uint8_t *buff, uint16_t len)
{
/* wait until I2C bus is idle */
while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY));
/* send a start condition to I2C bus */
i2c_start_on_bus(I2C1);
/* wait until SBSEND bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));
/* send slave address to I2C bus */
i2c_master_addressing(I2C1, EEPROM_SLAVE_ADDRESS, I2C_TRANSMITTER);
/* wait until ADDSEND bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
/* clear ADDSEND bit */
i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
/* wait until the transmit data buffer is empty */
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
/* write addr transmission */
/* 注意:24c02连续写不会自动翻页,注意每页字节数 */
i2c_data_transmit(I2C1, EEPROM_RW_ADDRESS);
/* wait until the TBE bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
for(uint16_t i = 0; i < len; i++)
{
/* data transmission */
i2c_data_transmit(I2C1, buff[i]);
/* wait until the TBE bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
}
/* send a stop condition to I2C bus */
i2c_stop_on_bus(I2C1);
while(I2C_CTL0(I2C1)&0x0200);
return TRUE;
}
/*从eeprom读取数据*/
bool app_eeprom_read(uint8_t *buff, uint16_t len)
{
/* wait until I2C bus is idle */
while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY));
/* send a start condition to I2C bus */
i2c_start_on_bus(I2C1);
/* wait until SBSEND bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));
/* send slave address to I2C bus */
i2c_master_addressing(I2C1, EEPROM_SLAVE_ADDRESS, I2C_TRANSMITTER);
/* wait until ADDSEND bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
/* clear ADDSEND bit */
i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
/* wait until the transmit data buffer is empty */
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
/* write addr transmission */
i2c_data_transmit(I2C1, EEPROM_RW_ADDRESS);
/* wait until the TBE bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
/* send a start condition to I2C bus */
i2c_start_on_bus(I2C1);
/* wait until SBSEND bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));
/* send slave address to I2C bus */
i2c_master_addressing(I2C1, EEPROM_SLAVE_ADDRESS, I2C_RECEIVER);
/* wait until ADDSEND bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
/* clear ADDSEND bit */
i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
for(uint8_t i = 0; i<len; i++)
{
if(i == len - 1)
{
/* disable acknowledge */
i2c_ack_config(I2C1, I2C_ACK_DISABLE);
}
/* wait until the RBNE bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_RBNE));
/* read a data from I2C_DATA */
buff[i] = i2c_data_receive(I2C1);
}
/* send a stop condition to I2C bus */
i2c_stop_on_bus(I2C1);
/* wait until stop condition generate */
while(I2C_CTL0(I2C1)&0x0200);
/* enable acknowledge */
i2c_ack_config(I2C1, I2C_ACK_ENABLE);
return TRUE;
}
GD32F105RCT6硬件IIC驱动24C02
需积分: 0 16 浏览量
2022-12-26
11:02:45
上传
评论 1
收藏 2KB ZIP 举报
内向的新之助
- 粉丝: 1
- 资源: 3
最新资源
- DHCP+NAPT+RIP+ACL
- Qt实战Qt项目(7)Qt实现网页浏览器
- Unity-WebGL配置系统教程(含iis本地部署)
- GIS图幅号计算工具,用于计算图幅号
- Python中Hadoop MapReduce的一个简单示例.zip
- Panoply软件是大名鼎鼎的NASA下属的GISS研究所开发的可视化软件,该软件可以实现对地学常用数据的读取,其中包括netC
- 一些高质量的学习Ruby的资源清单.zip
- 基于STM32智能家居(智能云)
- 适合江苏地带的别墅小院子图纸D038-两层-11.04&11.94米-施工图.dwg
- 农村小别墅图纸四合院图纸D037-两层-13.20&12.90米-施工图.dwg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈