HC32 IIC/I2C读写

news/2024/11/29 2:28:04/

IIC状态码

IIC 初始化

void iicInit(uint32_t speed)
{stc_gpio_cfg_t stcGpioCfg;DDL_ZERO_STRUCT(stcGpioCfg);Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);  //开启GPIO时钟门控stcGpioCfg.enDir = GpioDirOut;                           ///< 端口方向配置->输出stcGpioCfg.enOD = GpioOdEnable;                          ///< 开漏输出stcGpioCfg.enPu = GpioPuEnable;                          ///< 端口上拉配置->使能stcGpioCfg.enPd = GpioPdDisable;                         ///< 端口下拉配置->禁止Gpio_Init(GpioPortB, GpioPin8, &stcGpioCfg);             ///< 端口初始化Gpio_Init(GpioPortB, GpioPin9, &stcGpioCfg);Gpio_SetAfMode(GpioPortB, GpioPin8, GpioAf1);            ///< 配置PB08为SCLGpio_SetAfMode(GpioPortB, GpioPin9, GpioAf1);            ///< 配置PB09为SDAstc_i2c_cfg_t stcI2cCfg;DDL_ZERO_STRUCT(stcI2cCfg);                            ///< 初始化结构体变量的值为0Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0, TRUE); ///< 开启I2C0时钟门控stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq();             ///< 获取PCLK时钟stcI2cCfg.u32Baud = speed;                           ///< 1MHzstcI2cCfg.enMode = I2cMasterMode;                      ///< 主机模式stcI2cCfg.u8SlaveAddr = SLAVE_ADDR;             ///< 从地址,主模式无效stcI2cCfg.bGc = FALSE;                                 ///< 广播地址应答使能关闭I2C_Init(M0P_I2C0, &stcI2cCfg);                        ///< 模块初始化
}

IIC读写

/********************************************************************************** 主机接收函数** @param: I2CX** @param: I2C_DEVADDR    从机设备地址** @param:register_addr  读取寄存器addr** @param:pu8Data        读取addr的 data值** @param: u32Len         读取长度********************************************************************************/
en_result_t I2C_MasterReadData(M0P_I2C_TypeDef *I2CX, uint8_t I2C_DEVADDR, uint8_t register_addr, uint8_t *pu8Data, uint32_t u32Len)
{en_result_t enRet = Error;uint8_t u8i = 0, u8State;I2C_SetFunc(I2CX, I2cStart_En);while (1){while (0 == I2C_GetIrq(I2CX)){;}u8State = I2C_GetState(I2CX);switch (u8State){case 0x08:                                    //已发送起始条件,将发送SLA+RI2C_ClearFunc(I2CX, I2cStart_En);I2C_WriteByte(I2CX, (I2C_DEVADDR));       //发送SLA+Wbreak;case 0x18:                                    //已发送SLA+W,并接收到ACKI2C_WriteByte(I2CX, register_addr);       //发送内存地址break;case 0x28:                                    //已发送数据,接收到ACKI2C_SetFunc(I2CX, I2cStart_En);break;case 0x10:                                    //已发送重复起始条件I2C_ClearFunc(I2CX, I2cStart_En);I2C_WriteByte(I2CX, (I2C_DEVADDR) | 0x01); //读命令发送break;case 0x40:                                    //已发送SLA+R,并接收到ACKif (u32Len > 1){I2C_SetFunc(I2CX, I2cAck_En);}break;case 0x50:                                    //已接收数据字节,并已返回ACK信号pu8Data[u8i++] = I2C_ReadByte(I2CX);if (u8i == u32Len - 1){I2C_ClearFunc(I2CX, I2cAck_En);       //读数据时,倒数第二个字节ACK关闭}break;case 0x58:                                    //已接收到最后一个数据,NACK已返回pu8Data[u8i++] = I2C_ReadByte(I2CX);I2C_SetFunc(I2CX, I2cStop_En);            //发送停止条件break;case 0x38:                                    //在发送地址或数据时,仲裁丢失I2C_SetFunc(I2CX, I2cStart_En);           //当总线空闲时发起起始条件break;case 0x48:                                    //发送SLA+R后,收到一个NACKI2C_SetFunc(I2CX, I2cStop_En);I2C_SetFunc(I2CX, I2cStart_En);break;default:                                      //其他错误状态,重新发送起始条件I2C_SetFunc(I2CX, I2cStart_En);           //其他错误状态,重新发送起始条件break;}I2C_ClearIrq(I2CX);                               //清除中断状态标志位if (u8i == u32Len)                                //数据全部读取完成,跳出while循环{break;}}enRet = Ok;return enRet;
}/********************************************************************************** 主机发送函数** @param: I2CX** @param: I2C_DEVADDR    从机设备地址** @param:register_addr  写入寄存器addr** @param:pu8Data        写入addr的 data值** @param: u32Len         写入长度********************************************************************************/
en_result_t I2C_MasterWriteData(M0P_I2C_TypeDef *I2CX, uint8_t I2C_DEVADDR, uint8_t register_addr, uint8_t *pu8Data, uint32_t u32Len)
{en_result_t enRet = Error;uint8_t u8i = 0, u8State;I2C_SetFunc(I2CX, I2cStart_En);while (1){while (0 == I2C_GetIrq(I2CX)){;}u8State = I2C_GetState(I2CX);switch (u8State){case 0x08:                                 ///已发送起始条件I2C_ClearFunc(I2CX, I2cStart_En);I2C_WriteByte(I2CX, (I2C_DEVADDR));    ///从设备地址发送break;case 0x18:                                 ///已发送SLA+W,并接收到ACKI2C_WriteByte(I2CX, register_addr);break;case 0x28:                                 ///上一次发送数据后接收到ACKI2C_WriteByte(I2CX, pu8Data[u8i++]);break;case 0x20:                                 ///上一次发送SLA+W后,收到NACKcase 0x38:                                 ///上一次在SLA+读或写时丢失仲裁I2C_SetFunc(I2CX, I2cStart_En);        ///当I2C总线空闲时发送起始条件break;case 0x30:                                 ///已发送I2Cx_DATA中的数据,收到NACK,将传输一个STOP条件I2C_SetFunc(I2CX, I2cStop_En);         ///发送停止条件break;default:break;}if (u8i > u32Len){I2C_SetFunc(I2CX, I2cStop_En);             ///此顺序不能调换,出停止条件I2C_ClearIrq(I2CX);break;}I2C_ClearIrq(I2CX);                            ///清除中断状态标志位}enRet = Ok;return enRet;
}


http://www.ppmy.cn/news/1129302.html

相关文章

redis实现布隆过滤器

1 概述 布隆过滤器是一种基于概率的数据结构&#xff0c;用于判断一个元素是否存在于一个集合中。相比于传统的数据结构&#xff0c;布隆过滤器具有占用空间少、查询速度快的特点&#xff0c;常被用于缓存、爬虫去重等场景。Redis 作为一款流行的 NoSQL 数据库&#xff0c;也提…

源码编译安装pkg-config

安装环境&#xff1a;银河麒麟 1 到这个网址下载pkg-config源码&#xff1a; Index of /releases (pkg-config.freedesktop.org) 2 解压 3 进入解压后的目录。输入 ./configure 但是报错。 4 根据报错信息&#xff0c;将configure改为&#xff1a; ./configure --with-i…

Spring Cloud Netflix 教程和源码

本教程目标 想要系统地学习 Spring Cloud Netflix&#xff0c; 把自己的学习过程记录下来。 状态 持续更新中 微服务架构 微服务架构是一种将应用程序拆分为一组独立的、可独立部署的服务的架构模式。每个服务都运行在自己的进程中&#xff0c;可以独立地进行开发、测试和…

038:mapboxGL 旋转地图(rotateTo)

第038个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中旋转地图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhuan…

0x2C动态定义数据标识符服务

其实就是临时在指定地址创建个信息DID&#xff0c;里面可以存写临时数据&#xff0c;到时候可以给自己读写&#xff0c;但是这东西一重启或者过段时间就没了。要用0x22服务去读取&#xff0c;0x2A来写&#xff0c;不能用0x2E来写&#xff0c;协议认为0x2E不能指定地址来写。 这…

git_06_创建分支/查看分支

创建分支 # 创建分支的同时&#xff0c;切换到该分支上 > git checkout -b 分支名称 # 将本地分支推送到远端 > git push origin 分支名称:分支名称查看分支 # 查看本地分支 > git branch # 查看远程分支 > git branch -r # 查看所有分支 > git branch -a切换…

蓝桥等考Python组别七级003

第一部分:选择题 1、Python L7 (15分) 下面for循环语句中,变量i的取值范围是( )。 for i in range(1, 8): print(i) 1~81~70~80~7正确答案:B 2、Python L7 (15分) 下面哪一年是闰年?( ) 1994年

Oracle 11g_FusionOS_安装文档

同事让安装数据库&#xff0c;查询服务器信息发现操作系统是超聚变根据华为openEuler操作系统更改的自研操作系统&#xff0c;安装过程中踩坑不少&#xff0c;最后在超聚变厂商的技术支持下安装成功&#xff0c;步骤可参数该文。 一、 安装环境准备 1.1 软件下载 下载地址:…