吃了只脆皮鸡 发表于 2024-7-31 12:07:27

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();                                 //发送停止命令
}


最后,以上信息仅个人使用分享,如有不妥,联系删除!!!


soma 发表于 2024-7-31 13:22:16


数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址

乘风飞扬 发表于 2024-7-31 16:09:52

soma 发表于 2024-7-31 13:22
数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址 ...

7位的设备地址+1位的读写控制:



吃了只脆皮鸡 发表于 2024-7-31 17:39:46

乘风飞扬 发表于 2024-7-31 16:09
7位的设备地址+1位的读写控制:
I2C可以这么理解,7位的设备地址左移一位,就是写地址,写地址或上0x01,就是读命令,所以写地址可作为设备地址,我通常都是这么用的

吃了只脆皮鸡 发表于 2024-7-31 17:44:49

soma 发表于 2024-7-31 13:22
数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址 ...

I2C的写地址是设备地址左移一位的结果,可充当设备地址,读地址只需要在写地址上或它个0x01就好了

吃了只脆皮鸡 发表于 2024-7-31 17:55:53

具体使用参考这样

ryhyc 发表于 2025-5-11 22:16:04

学习了
页: [1]
查看完整版本: STC32G库函数I2C修改