找回密码
 立即注册
查看: 416|回复: 5

STC32G库函数I2C修改

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-01-27 23:56:26

6

主题

12

回帖

114

积分

注册会员

积分
114
发表于 2024-7-31 12:07:27 | 显示全部楼层 |阅读模式
原STC32G库函数的I2C读写函数上,对器件地址做了固定,

截图202407311154554130.jpg
截图202407311156084479.jpg

这样的话,因为我一个I2C通道上挂了好几个设备,这个函数不能满足我灵活读取不同I2C设备数据的需求,
所以我将库函数里的代码做了适当修改:将函数里的固定地址去掉,添加了设备地址参数
截图202407311200547105.jpg

截图202407311201392617.jpg

做了这样的修改之后,就可以方便的读写不同的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();                                 //发送停止命令
}


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


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-7-31 13:22:16 来自手机 | 显示全部楼层
1000008194.jpg
数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-7-31 16:09:52 | 显示全部楼层
so*** 发表于 2024-7-31 13:22
数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址 ...

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

截图202407311608535295.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-01-27 23:56:26

6

主题

12

回帖

114

积分

注册会员

积分
114
发表于 2024-7-31 17:39:46 | 显示全部楼层
乘风*** 发表于 2024-7-31 16:09
7位的设备地址+1位的读写控制:

I2C可以这么理解,7位的设备地址左移一位,就是写地址,写地址或上0x01,就是读命令,所以写地址可作为设备地址,我通常都是这么用的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-01-27 23:56:26

6

主题

12

回帖

114

积分

注册会员

积分
114
发表于 2024-7-31 17:44:49 | 显示全部楼层
so*** 发表于 2024-7-31 13:22
数据手册对该宏定义是这样写的,这个不是i2c的设备地址吧,只是读写地址 ...

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-01-27 23:56:26

6

主题

12

回帖

114

积分

注册会员

积分
114
发表于 2024-7-31 17:55:53 | 显示全部楼层
截图202407311754561374.jpg 具体使用参考这样
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:31 , Processed in 0.111788 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表