从机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通信相关推荐

  1. 华大单片机HC32L130/HC32L136红外端口配置

    华大单片机HC32L130/HC32L136红外端口配置 HC32L130一共有三个引脚可以配置成红外38.4KHZ输出引脚 #define PIN_PWM_IR GpioPortB, GpioPin ...

  2. 华大单片机HC32L130 / HC32L136 / HC32F030 系列硬件开发指南

    适用对象 系列 产品型号 HC32L130 HC32L130E8PA / HC32L130F8UA / HC32L130J8TA / HC32L130J8UA HC32L136 HC32L136J8T ...

  3. 51单片机开发板模拟实现IIC通信

    51单片机模拟实现IIC通信 IIC.h IIC.c main.c 总结 IIC.h #ifndef _iic_h_ #define _iic_h_ #include <reg52.h> ...

  4. 华大单片机HC32L130使用内部RCH时钟源倍频24M外设PCLK到48M

    最近使用HC32L130xxx单片机做项目,使用内部RCH做为主时钟源,RCH时钟源最高频率为24M,但是可以通过倍频PLL到48M,时钟源示意图如下图所示. 配置时钟时注意事项 1.在配置时钟源频率 ...

  5. python3中利用serial模块实现单片机与python上位机的通信(串口调试助手)

    1.指标:    python上位机向单片机发送字符,单片机如果收到的字符为'1',则点亮灯1,如果收到的字符为'2',则点亮灯2:单片机若接受到字符,读取字符后,向python上位机发送字符(1-& ...

  6. 华大单片机HC32L130/136驱动NB-IOT模块(MN316)

    频段:band5/8 PDP(Packet Data Protocol,分组数据协议),是外部PDN网与GPRS接口所用的网络协议. PDP附着是让终端登录到PS域里,就是登记到SGSN/PDSN的数 ...

  7. 华大单片机HC32L130/HC32L136PWM配置

    标题可编程计数阵列PCA PCA(可编程计数器阵列 Programmable Counter Array)支持最多 5 个 16 位的捕获/比较 模块.该定时/计数器可用作为一个通用的时钟计数/事件计 ...

  8. 易语言和c51通信,51单片机与PC上位机串口通信之LED控制

    #include #define uint8 unsigned char #define uint16 unsigned int uint8 receive_buffer[6];            ...

  9. [转]从IIC实测波形入手,搞懂IIC通信

    (转载请删除括号里的内容) 玩单片机的朋友都知道IIC通信这个工具,但好多人只是会用,内部的原理不求甚解,或是想要了解其原理,但却对抽象的时序描述一头雾水.本文将从实测的IIC波形入手,带你看到真实的 ...

最新文章

  1. 单词不用背,学完自然会!”这个方法,你知道越早越好!
  2. 一口气说出 6 种 @Transactional 注解的失效场景
  3. EASYHOOK逆向寒假生涯(20/100)
  4. 重写 隐藏 java_Java中方法的重写与成员变量的隐藏
  5. Hadoop RPC机制的使用
  6. ubuntu远程桌面连接命令rdesktop连接windows远程桌面详解
  7. mac vim python3_VIM学习笔记 编译源码(Compile Code)-Python
  8. 关于使用_bstr_t的一个坑
  9. uni-app发布为H5页面白屏问题
  10. 主题:web.config中AppSettings和ConnectionStrings的区别
  11. 【细胞分割】基于matlab GUI生物细胞计数【含Matlab源码 758期】
  12. LinuxCNC学习-HAL库介绍
  13. 矩阵分解 三角分解(LU分解)
  14. 乔伊·伯纳尔(Joey Bernal)的评论专栏,社交网络的三阶段路线图
  15. echarts结合阿里云地图json选择器展示地图
  16. 查看windows系统默认编码 修改windows系统默认编码
  17. Dremel made simple with Parquet
  18. Kafka使用报错Subscription to topics, partitions and pattern are mutually exclusive
  19. 什么是EOS智能合约
  20. Highway Networks网络详解

热门文章

  1. 分享三个可以在家做的正规兼职工作,看到就是赚到
  2. 三菱iQ-R系列PLC控制系统项目全套资料
  3. 辣评10月自主轿车销量:帝豪下滑 “寒冬”之下取暖还得靠新能源
  4. RK3288开发板GPIO介绍
  5. MC辨析(蒙特卡洛)
  6. PC3000可恢复的SSD固态硬盘支持列表
  7. 不信谣,不传谣,不造谣
  8. 知乎自动化登录(2021.3)
  9. npm install 报错up to date, audited 1 package in 133msfound 0 vulnerabilities
  10. 关于nmap -O扫描中出现索尼手机的一份调研