STC32G库函数I2C修改
原STC32G库函数的I2C读写函数上,对器件地址做了固定,这样的话,因为我一个I2C通道上挂了好几个设备,这个函数不能满足我灵活读取不同I2C设备数据的需求,
所以我将库函数里的代码做了适当修改:将函数里的固定地址去掉,添加了设备地址参数
做了这样的修改之后,就可以方便的读写不同的I2C设备了,其它地方不做修改,
.h文件修改地方
//void I2C_WriteNbyte(uint8_t addr, uint8_t *p, uint8_t number);原STC
void I2C_WriteNbyte(uint8_t Dev_addr,uint8_t Mem_addr, uint8_t *p, uint8_t number);//个人修改
//void I2C_ReadNbyte( uint8_t addr, uint8_t *p, uint8_t number);原STC
void I2C_ReadNbyte(uint8_t Dev_addr,uint8_t Mem_addr, uint8_t *p, uint8_t number);//个人修改
.c文件的修改
//========================================================================
// 函数: void I2C_WriteNbyte(uint8_t Dev_addr,uint8_t Mem_addr,uint8_t *p, uint8_t number)
// 描述: I2C写入数据函数.
// 参数: Dev_addr:设备地址,Men_addr: 内存地址, *p写入数据存储位置, number写入数据个数.
// 返回: none.
// 版本: V1.0, 2023/09/23
//========================================================================
void I2C_WriteNbyte(uint8_t Dev_addr,uint8_t Mem_addr, uint8_t *p, uint8_t number)/*WordAddress,First Data Address,Byte lenth */
{
Start(); //发送起始命令
SendData(Dev_addr); //发送设备地址+写命令
RecvACK();
SendData(Mem_addr); //发送存储地址
RecvACK();
do
{
SendData(*p++);
RecvACK();
}
while(--number);
Stop(); //发送停止命令
}
//========================================================================
// 函数: void I2C_ReadNbyte(uint8_t addr, uint8_t *p, uint8_t number)
// 描述: I2C读取数据函数.
// 参数: Dev_addr:设备地址,Men_addr: 内存地址,*p读取数据存储位置, number读取数据个数.
// 返回: none.
// 版本: V1.0, 2023/09/23
//========================================================================
void I2C_ReadNbyte(uint8_t Dev_addr,uint8_t Mem_addr, uint8_t *p, uint8_t number) /*WordAddress,First Data Address,Byte lenth */
{
Start(); //发送起始命令
SendData(Dev_addr); //发送设备地址+写命令
RecvACK();
SendData(Mem_addr); //发送存储地址
RecvACK();
Start(); //发送起始命令
SendData(Dev_addr|0x01); //发送设备地址+读命令
RecvACK();
do
{
*p = RecvData();
p++;
if(number != 1) SendACK(); //send ACK
}
while(--number);
SendNAK(); //send no ACK
Stop(); //发送停止命令
}
最后,以上信息仅个人使用分享,如有不妥,联系删除!!!
数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址 soma 发表于 2024-7-31 13:22
数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址 ...
7位的设备地址+1位的读写控制:
乘风飞扬 发表于 2024-7-31 16:09
7位的设备地址+1位的读写控制:
I2C可以这么理解,7位的设备地址左移一位,就是写地址,写地址或上0x01,就是读命令,所以写地址可作为设备地址,我通常都是这么用的 soma 发表于 2024-7-31 13:22
数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址 ...
I2C的写地址是设备地址左移一位的结果,可充当设备地址,读地址只需要在写地址上或它个0x01就好了 具体使用参考这样 学习了
页:
[1]