[方案相关] 工业级压力传感器设计及实现(华大半导体HC32L136)

[复制链接]
2669|40
 楼主| 有何不可0365 发表于 2021-2-28 23:05 | 显示全部楼层
 楼主| 有何不可0365 发表于 2021-2-28 23:06 | 显示全部楼层
当起始信号产生后,主机立即传输数据的第一字节:7 位从机地址 + 读写位,读写位控制从机的数据传输方向(0:写;1:读)。被主机寻址的从机会通过在第 9 个 SCL时钟周期将 SDA 置为低电平作为应答。
 楼主| 有何不可0365 发表于 2021-2-28 23:06 | 显示全部楼层
数据传输过程中,一个 SCL 时钟脉冲传输一个数据位,且 SDA 线只有在 SCL 为低时才可以改变。I2C 总线上位传输图如下所示:

 楼主| 有何不可0365 发表于 2021-2-28 23:07 | 显示全部楼层
 楼主| 有何不可0365 发表于 2021-2-28 23:08 | 显示全部楼层
 楼主| 有何不可0365 发表于 2021-2-28 23:08 | 显示全部楼层
华大半导体I2C 组件可实现 8 位的双向数据传输,传输速率在标准模式下可达到 100Kbps 而在高速模式下可达 400Kbps,在超高速模式下可达 1Mbps,并且可以在四种模式下工作:主机发送模式、主机接收模式、从机接收模式、从机发送模式。 还有一种特殊模式广播呼叫模式,其操作方式与从机接收模式类似。
————————————————
 楼主| 有何不可0365 发表于 2021-2-28 23:09 | 显示全部楼层
华大半导体HC32L136 I2C 控制器支持以下特性:

支持主机发送/接收,从机发送/接收四种工作模式
支持标准(100Kbps) / 快速(400Kbps) / 高速(1Mbps) 三种工作速率
支持 7 位寻址功能
支持噪声过滤功能
支持广播地址
支持中断状态查询功能
 楼主| 有何不可0365 发表于 2021-2-28 23:10 | 显示全部楼层
I2C功能模块如下图所示: 82598603bb238dd59f.png
 楼主| 有何不可0365 发表于 2021-2-28 23:10 | 显示全部楼层
 楼主| 有何不可0365 发表于 2021-2-28 23:11 | 显示全部楼层
本项目中采用主机模式实现数据收、发通信,主收、发送模式数据同步图如下图所示(更详细说明可参见用户手册):
 楼主| 有何不可0365 发表于 2021-2-28 23:12 | 显示全部楼层
 楼主| 有何不可0365 发表于 2021-2-28 23:12 | 显示全部楼层
 楼主| 有何不可0365 发表于 2021-2-28 23:13 | 显示全部楼层
4、项目实现
第1步:明确从机地址(压力传感器地址),NSA2862 的 I2C 设备地址如下表所示:
76671603bb2fe98bba.png
 楼主| 有何不可0365 发表于 2021-2-28 23:14 | 显示全部楼层
第2步:配置HC32L136 I2C功能模块,这里需要留意NSA2862 的 I2C通讯引脚的电性特性,如下表所示:
 楼主| 有何不可0365 发表于 2021-2-28 23:14 | 显示全部楼层
 楼主| 有何不可0365 发表于 2021-2-28 23:16 | 显示全部楼层
 楼主| 有何不可0365 发表于 2021-2-28 23:17 | 显示全部楼层
I2C GPIO配置代码如下所示:
 楼主| 有何不可0365 发表于 2021-2-28 23:19 | 显示全部楼层
  1. ///< IO端口配置
  2. void App_PortCfg(void)
  3. {
  4.     stc_gpio_cfg_t stcGpioCfg;
  5.    
  6.     DDL_ZERO_STRUCT(stcGpioCfg);
  7.    
  8.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);   //开启GPIO时钟门控
  9.    
  10.     stcGpioCfg.enDir = GpioDirOut;                           ///< 端口方向配置->输出   
  11.     stcGpioCfg.enOD = GpioOdEnable;                          ///< 开漏输出
  12.     stcGpioCfg.enPu = GpioPuEnable;                          ///< 端口上拉配置->使能
  13.     stcGpioCfg.enPd = GpioPdDisable;                         ///< 端口下拉配置->禁止
  14.    
  15.     Gpio_Init(GpioPortB,GpioPin8,&stcGpioCfg);               ///< 端口初始化
  16.     Gpio_Init(GpioPortB,GpioPin9,&stcGpioCfg);
  17.    
  18.     Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf1);              ///< 配置PB08为SCL
  19.     Gpio_SetAfMode(GpioPortB,GpioPin9,GpioAf1);              ///< 配置PB09为SDA
  20. }
 楼主| 有何不可0365 发表于 2021-2-28 23:20 | 显示全部楼层
I2C配置代码如下所示:
 楼主| 有何不可0365 发表于 2021-2-28 23:21 | 显示全部楼层

  1. ///< I2C 模块配置[em:23:]
  2. void App_I2cCfg(void)
  3. {
  4.     stc_i2c_cfg_t stcI2cCfg;
  5.    
  6.     DDL_ZERO_STRUCT(stcI2cCfg);                            ///< 初始化结构体变量的值为0
  7.    
  8.     Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0,TRUE); ///< 开启I2C0时钟门控
  9.    
  10.     stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq();             ///< 获取PCLK时钟
  11.     stcI2cCfg.u32Baud = 100000;                            ///< 100K
  12.     stcI2cCfg.enMode = I2cMasterMode;                      ///< 主机模式
  13.     stcI2cCfg.bGc = FALSE;                                 ///< 广播地址应答使能关闭
  14.     I2C_Init(M0P_I2C0,&stcI2cCfg);                         ///< 模块初始化
  15. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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