[其他] 华大单片机HC32L130/HC32L136从机IIC通信

[复制链接]
7146|13
 楼主| 雨果喝水 发表于 2021-9-28 20:58 | 显示全部楼层 |阅读模式
从机IIC理论知识
主机IIC的做法比较多,从机IIC的就相对比较难一点。
先补充一下从机IIC的思路:
657446153116c4c7e2.png
先看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为主机读数据
·接收八位寄存器地址
·接收数据

 楼主| 雨果喝水 发表于 2021-9-28 20:59 | 显示全部楼层
华大单片机HC32L130/HC32L136从机IIC通信
选用中断方式进行:
  1. uint8_t u8Recdata1[10] = {0x00};
  2. uint8_t u8Recdata[10]={0x00};
  3. uint8_t u8SendLen=0;
  4. uint8_t u8RecvLen=0;
  5. uint8_t u8RecvLen1=0;
  6. uint8_t u8State = 0;
  7. static void I2c0CallBack(void)
  8. {
  9. u8State = I2C_GetState(I2C0);
  10.     switch(u8State)
  11.     {
  12.     case 0x60:
  13.         case 0x70:
  14.         case 0xa0:
  15.             u8RecvLen = 0;
  16.             I2C_SetFunc(I2C0,I2cAck_En);
  17.             break;
  18.         case 0x68:
  19.         case 0x78:
  20.         case 0x88:
  21.         case 0x98:
  22.             I2C_SetFunc(I2C0,I2cAck_En);
  23.             break;
  24.         case 0x80:
  25.   case 0x90:   
  26.    u8Recdata[u8RecvLen++] = I2C_ReadByte(I2C0);//接收数据
  27.             break;  
  28.         case 0xa8://接收读命令返回ACK
  29.   case 0xb0:
  30.             u8SendLen = 0;
  31.             I2C_WriteByte(I2C0,u8Recdata[u8SendLen++]);//发送数据首字节
  32.             break;
  33.         case 0xb8:
  34.             I2C_WriteByte(I2C0,u8Recdata[u8SendLen++]);
  35.             break;
  36.         case 0xc0:
  37.         case 0xc8:
  38.             break;
  39.     }
  40.     I2C_ClearIrq(I2C0);
  41. }


  42. void IIC_SlaveGpioConfig(void)
  43. {
  44. stc_i2c_addr_t stcSlaveAddr;
  45.     stc_gpio_config_t stcGpioCfg;
  46.     stc_i2c_config_t stcI2cCfg;
  47.     stc_sysctrl_clk_config_t stcCfg;
  48.     DDL_ZERO_STRUCT(stcCfg);
  49.     DDL_ZERO_STRUCT(stcI2cCfg);
  50.     DDL_ZERO_STRUCT(stcGpioCfg);
  51.     DDL_ZERO_STRUCT(stcSlaveAddr);
  52.     Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE);
  53.     Sysctrl_SysClkSwitch(SysctrlClkRCL);
  54.     Sysctrl_SetRCHTrim(SysctrlRchFreq24MHz);
  55. Sysctrl_SysClkSwitch(SysctrlClkRCH);
  56. Sysctrl_ClkSourceEnable(SysctrlClkRCL,FALSE);
  57.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
  58.     Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0,TRUE);
  59.     stcGpioCfg.enDir = GpioDirOut;
  60.     stcGpioCfg.enOD = GpioOdEnable;
  61.     stcGpioCfg.enPuPd = GpioPu;
  62.     Gpio_Init(GpioPortB, GpioPin8,&stcGpioCfg);//端口初始化
  63.     Gpio_Init(GpioPortB, GpioPin9,&stcGpioCfg);
  64.     Gpio_SetAfMode(GpioPortB, GpioPin8,GpioAf1);//SCL
  65.     Gpio_SetAfMode(GpioPortB, GpioPin9,GpioAf1);//SDA
  66.     stcI2cCfg.enFunc = I2cBaud_En;
  67.     stcI2cCfg.u8Tm = 0x02;//1M=(24000000/(8*(2+1))//波特率配置
  68.     stcI2cCfg.pfnI2c0Cb = I2c0CallBack;
  69.     stcI2cCfg.bTouchNvic = TRUE;
  70.     I2C_DeInit(I2C0);
  71.     stcSlaveAddr.Addr = 0x12;
  72.     stcSlaveAddr.Gc = 0;
  73.     I2C_Init(I2C0,&stcI2cCfg);//模块初始化
  74. I2C_WriteSlaveAddr(I2C0,&stcSlaveAddr);//写从机设备地址
  75.     I2C_SetFunc(I2C0,I2cMode_En);//模块使能
  76.     I2C_SetFunc(I2C0,I2cAck_En);//ACK打开
  77.   if(TRUE == stcI2cCfg.bTouchNvic)
  78.   {
  79.   EnableNvic(I2C0_IRQn,IrqLevel3,TRUE);
  80.   }
  81. }

  82. int32_t main(void)
  83. {
  84. IIC_SlaveGpioConfig();
  85. while(1)
  86. {
  87. }
  88. }
 楼主| 雨果喝水 发表于 2021-9-28 21:00 | 显示全部楼层
自己找一个主机跟这个例程通信就可以了,有一个需要注意的点就是,从机地址跟主机地址必须一致才行。
duo点 发表于 2021-10-3 14:15 来自手机 | 显示全部楼层
很棒的从机IIC理论知识
aspoke 发表于 2021-10-6 14:13 | 显示全部楼层
iic使用io口模拟就行。   
232321122 发表于 2021-10-6 14:13 | 显示全部楼层
从机IIC通信不是正常吗   
ghuca 发表于 2021-10-6 14:13 | 显示全部楼层
用过从机吗   
soodesyt 发表于 2021-10-6 14:13 | 显示全部楼层
主机IIC的做法用多。   
mnynt121 发表于 2021-10-6 14:14 | 显示全部楼层
从机能够出发iic中断吗   
plsbackup 发表于 2021-10-6 14:14 | 显示全部楼层
两个单片机通信可以使用串口的   
kmzuaz 发表于 2021-10-6 14:14 | 显示全部楼层
如何定义从机和主机呢?   
qiufengsd 发表于 2021-10-6 14:14 | 显示全部楼层
雨果喝水 发表于 2021-9-28 20:59
华大单片机HC32L130/HC32L136从机IIC通信
选用中断方式进行:

这个官网有例程吧     
pl202 发表于 2021-10-6 14:14 | 显示全部楼层
雨果喝水 发表于 2021-9-28 20:59
华大单片机HC32L130/HC32L136从机IIC通信
选用中断方式进行:

如何判断返回什么数据   
eefas 发表于 2021-10-6 14:15 | 显示全部楼层
雨果喝水 发表于 2021-9-28 20:59
华大单片机HC32L130/HC32L136从机IIC通信
选用中断方式进行:

例程通信呢?      
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

1213

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部