- 打卡等级:偶尔看看I
- 打卡总天数:13
- 最近打卡:2025-01-27 23:56:26
注册会员
- 积分
- 114
|
原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(); //发送停止命令
}
最后,以上信息仅个人使用分享,如有不妥,联系删除!!!
|
|