主控平台使用gd32f303cg,eeprom使用BL24C256A 大小32kb
使用iic主要有以下的几种信号
起始信号:
//在iic总线上发送起始位
uint8_t iic_start(void){
uint16_t timeout=0;
while(i2c_flag_get(I2CX, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) {
timeout++;
}
if(timeout < I2C_TIME_OUT) {
i2c_start_on_bus(I2CX);
return 1;
} else {
return 0;
}
}
在总线上发送从机设备地址:
这里trandirection参数表示读取还是写入,如果是读取在i2c_master_addressing函数内部会自动在最低位置1,如果是写入那么会自动将最低为清零
//在iic总线上发送从机地址并清除ADDSEND
uint8_t iic_slave_address(uint8_t addr,uint32_t trandirection){
uint16_t timeout=0;
while((!i2c_flag_get(I2CX, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)) {
timeout++;
}
if(timeout < I2C_TIME_OUT) {
i2c_master_addressing(I2CX,addr, trandirection);
timeout=0;
while((!i2c_flag_get(I2CX, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)) {
timeout++;
}
if(timeout < I2C_TIME_OUT) {
i2c_flag_clear(I2CX, I2C_FLAG_ADDSEND);//根据要求清除ADDSEND位
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
读出iic总线上的数据:
根据gd32官方文档在读取最后一个字节之前要将ACKEN位清0,并将STOP位置1,以确保NACK发送给最后一个字节。
//查询TBE的方式写入数据,适用与前n-2个数据
uint8_t iic_datasendTBE(uint8_t iic_data){
uint16_t timeout=0;
while((! i2c_flag_get(I2CX, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)) {
timeout++;
}
if(timeout < I2C_TIME_OUT) {
i2c_data_transmit(I2CX, iic_data);
return 1;
} else {
return 0;
}
}
//最后一位数据读取时调用
uint8_t iic_dataread_N_2(uint8_t* p_buffer){
uint16_t timeout=0;
/* wait until BTC bit is set */
// while(!i2c_flag_get(I2CX, I2C_FLAG_BTC));
/* disable acknowledge */
i2c_ack_config(I2CX, I2C_ACK_DISABLE);
/* wait until BTC bit is set */
// while(!i2c_flag_get(I2CX, I2C_FLAG_BTC));
/* send a stop condition to I2C bus */
i2c_stop_on_bus(I2CX);
while(timeout<I2C_TIME_OUT) {
timeout++;
/* wait until RBNE bit is set */
if(i2c_flag_get(I2CX, I2C_FLAG_RBNE)) {
/* read a byte from the EEPROM */
*p_buffer = i2c_data_receive(I2CX);
return 1;
/* point to the next location where the byte read will be saved */
}
}
return 0;
}
在总线上生成停止位
uint8_t iic_stop(void){
uint16_t timeout=0;
while((!i2c_flag_get(I2CX, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)) {
//等待最后一个字节发送完成,随后产生停止信号
timeout++;
}
if(timeout < I2C_TIME_OUT) {
i2c_stop_on_bus(I2CX);
timeout=0;
while((I2C_CTL0(I2CX) & I2C_CTL0_STOP) && (timeout < I2C_TIME_OUT)) {
//等待停止信号发送完成
timeout++;
}
if(timeout < I2C_TIME_OUT) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
然后是读写的函数,这里给出单字节写入,单字节读取,随机不定长写入和随机不定长数据读取。最常用还是最后两个,单字节读取只能读取上一次写入的地址不能指定地址
//eepron单字节写入
uint8_t eeprom_writeonebyte(uint16_t addr

文章详细描述了如何使用GD32F303CG微控制器通过I2C接口与BL24C256AEEPROM进行通信,包括起始信号、从机地址发送、数据读写以及停止信号的生成。提供了单字节和随机读写的函数实现,强调了在长字节操作中需注意页限制的问题。
最低0.47元/天 解锁文章
802





