华大单片机HC32L130/HC32L136从机IIC通信
从机IIC理论知识
主机IIC的做法比较多,从机IIC的就相对比较难一点。
先补充一下从机IIC的思路:
先看IIC时序图,然后根据时序图理清IIC从机需要做哪些判断:
从机发送:
·判断IIC START信号,有IIC start信号过来之后进入从机地址接收判断
·判断SCL搞低电平
·在IIC高电平期间判断SDA电平
·接收到八位从机地址后判断地址是否跟设备从机地址一致
·接收到的从机地址跟设备地址一致则从机发送ACK
·判断地址位的最低位是0还是1,0为主机写数据,1为主机读数据
·接收八位寄存器地址
·再次检测IIC START信号
·接收八位从机地址
·进入从机发送数据的程序。
从机发送:
·判断IIC START信号,有IIC start信号过来之后进入从机地址接收判断
·判断SCL搞低电平
·在IIC高电平期间判断SDA电平
·接收到八位从机地址后判断地址是否跟设备从机地址一致
·接收到的从机地址跟设备地址一致则从机发送ACK
·判断地址位的最低位是0还是1,0为主机写数据,1为主机读数据
·接收八位寄存器地址
·接收数据
华大单片机HC32L130/HC32L136从机IIC通信
选用中断方式进行:
uint8_t u8Recdata1[10] = {0x00};
uint8_t u8Recdata[10]={0x00};
uint8_t u8SendLen=0;
uint8_t u8RecvLen=0;
uint8_t u8RecvLen1=0;
uint8_t u8State = 0;
static void I2c0CallBack(void)
{u8State = I2C_GetState(I2C0);switch(u8State){case 0x60:case 0x70:case 0xa0:u8RecvLen = 0;I2C_SetFunc(I2C0,I2cAck_En);break;case 0x68:case 0x78:case 0x88:case 0x98:I2C_SetFunc(I2C0,I2cAck_En);break;case 0x80:case 0x90: u8Recdata[u8RecvLen++] = I2C_ReadByte(I2C0);//接收数据break; case 0xa8://接收读命令返回ACKcase 0xb0:u8SendLen = 0;I2C_WriteByte(I2C0,u8Recdata[u8SendLen++]);//发送数据首字节break;case 0xb8:I2C_WriteByte(I2C0,u8Recdata[u8SendLen++]);break;case 0xc0:case 0xc8:break;}I2C_ClearIrq(I2C0);
}void IIC_SlaveGpioConfig(void)
{stc_i2c_addr_t stcSlaveAddr;stc_gpio_config_t stcGpioCfg;stc_i2c_config_t stcI2cCfg;stc_sysctrl_clk_config_t stcCfg;DDL_ZERO_STRUCT(stcCfg);DDL_ZERO_STRUCT(stcI2cCfg);DDL_ZERO_STRUCT(stcGpioCfg);DDL_ZERO_STRUCT(stcSlaveAddr);Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE);Sysctrl_SysClkSwitch(SysctrlClkRCL);Sysctrl_SetRCHTrim(SysctrlRchFreq24MHz);Sysctrl_SysClkSwitch(SysctrlClkRCH);Sysctrl_ClkSourceEnable(SysctrlClkRCL,FALSE);Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0,TRUE);stcGpioCfg.enDir = GpioDirOut;stcGpioCfg.enOD = GpioOdEnable;stcGpioCfg.enPuPd = GpioPu;Gpio_Init(GpioPortB, GpioPin8,&stcGpioCfg);//端口初始化Gpio_Init(GpioPortB, GpioPin9,&stcGpioCfg);Gpio_SetAfMode(GpioPortB, GpioPin8,GpioAf1);//SCLGpio_SetAfMode(GpioPortB, GpioPin9,GpioAf1);//SDAstcI2cCfg.enFunc = I2cBaud_En;stcI2cCfg.u8Tm = 0x02;//1M=(24000000/(8*(2+1))//波特率配置stcI2cCfg.pfnI2c0Cb = I2c0CallBack;stcI2cCfg.bTouchNvic = TRUE;I2C_DeInit(I2C0);stcSlaveAddr.Addr = 0x12;stcSlaveAddr.Gc = 0;I2C_Init(I2C0,&stcI2cCfg);//模块初始化I2C_WriteSlaveAddr(I2C0,&stcSlaveAddr);//写从机设备地址I2C_SetFunc(I2C0,I2cMode_En);//模块使能I2C_SetFunc(I2C0,I2cAck_En);//ACK打开if(TRUE == stcI2cCfg.bTouchNvic){EnableNvic(I2C0_IRQn,IrqLevel3,TRUE);}
}int32_t main(void)
{IIC_SlaveGpioConfig();
while(1)
{}
}
自己找一个主机跟这个例程通信就可以了,有一个需要注意的点就是,从机地址跟主机地址必须一致才行。
华大单片机HC32L130/HC32L136从机IIC通信相关推荐
- 华大单片机HC32L130/HC32L136红外端口配置
华大单片机HC32L130/HC32L136红外端口配置 HC32L130一共有三个引脚可以配置成红外38.4KHZ输出引脚 #define PIN_PWM_IR GpioPortB, GpioPin ...
- 华大单片机HC32L130 / HC32L136 / HC32F030 系列硬件开发指南
适用对象 系列 产品型号 HC32L130 HC32L130E8PA / HC32L130F8UA / HC32L130J8TA / HC32L130J8UA HC32L136 HC32L136J8T ...
- 51单片机开发板模拟实现IIC通信
51单片机模拟实现IIC通信 IIC.h IIC.c main.c 总结 IIC.h #ifndef _iic_h_ #define _iic_h_ #include <reg52.h> ...
- 华大单片机HC32L130使用内部RCH时钟源倍频24M外设PCLK到48M
最近使用HC32L130xxx单片机做项目,使用内部RCH做为主时钟源,RCH时钟源最高频率为24M,但是可以通过倍频PLL到48M,时钟源示意图如下图所示. 配置时钟时注意事项 1.在配置时钟源频率 ...
- python3中利用serial模块实现单片机与python上位机的通信(串口调试助手)
1.指标: python上位机向单片机发送字符,单片机如果收到的字符为'1',则点亮灯1,如果收到的字符为'2',则点亮灯2:单片机若接受到字符,读取字符后,向python上位机发送字符(1-& ...
- 华大单片机HC32L130/136驱动NB-IOT模块(MN316)
频段:band5/8 PDP(Packet Data Protocol,分组数据协议),是外部PDN网与GPRS接口所用的网络协议. PDP附着是让终端登录到PS域里,就是登记到SGSN/PDSN的数 ...
- 华大单片机HC32L130/HC32L136PWM配置
标题可编程计数阵列PCA PCA(可编程计数器阵列 Programmable Counter Array)支持最多 5 个 16 位的捕获/比较 模块.该定时/计数器可用作为一个通用的时钟计数/事件计 ...
- 易语言和c51通信,51单片机与PC上位机串口通信之LED控制
#include #define uint8 unsigned char #define uint16 unsigned int uint8 receive_buffer[6]; ...
- [转]从IIC实测波形入手,搞懂IIC通信
(转载请删除括号里的内容) 玩单片机的朋友都知道IIC通信这个工具,但好多人只是会用,内部的原理不求甚解,或是想要了解其原理,但却对抽象的时序描述一头雾水.本文将从实测的IIC波形入手,带你看到真实的 ...
最新文章
- 单词不用背,学完自然会!”这个方法,你知道越早越好!
- 一口气说出 6 种 @Transactional 注解的失效场景
- EASYHOOK逆向寒假生涯(20/100)
- 重写 隐藏 java_Java中方法的重写与成员变量的隐藏
- Hadoop RPC机制的使用
- ubuntu远程桌面连接命令rdesktop连接windows远程桌面详解
- mac vim python3_VIM学习笔记 编译源码(Compile Code)-Python
- 关于使用_bstr_t的一个坑
- uni-app发布为H5页面白屏问题
- 主题:web.config中AppSettings和ConnectionStrings的区别
- 【细胞分割】基于matlab GUI生物细胞计数【含Matlab源码 758期】
- LinuxCNC学习-HAL库介绍
- 矩阵分解 三角分解(LU分解)
- 乔伊·伯纳尔(Joey Bernal)的评论专栏,社交网络的三阶段路线图
- echarts结合阿里云地图json选择器展示地图
- 查看windows系统默认编码 修改windows系统默认编码
- Dremel made simple with Parquet
- Kafka使用报错Subscription to topics, partitions and pattern are mutually exclusive
- 什么是EOS智能合约
- Highway Networks网络详解