有何不可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功能模块如下图所示:
有何不可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 设备地址如下表所示:
有何不可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
///< IO端口配置
void App_PortCfg(void)
{
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为SCL
Gpio_SetAfMode(GpioPortB,GpioPin9,GpioAf1); ///< 配置PB09为SDA
}
有何不可0365
发表于 2021-2-28 23:20
I2C配置代码如下所示:
有何不可0365
发表于 2021-2-28 23:21
///< I2C 模块配置
void App_I2cCfg(void)
{
stc_i2c_cfg_t stcI2cCfg;
DDL_ZERO_STRUCT(stcI2cCfg); ///< 初始化结构体变量的值为0
Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0,TRUE); ///< 开启I2C0时钟门控
stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获取PCLK时钟
stcI2cCfg.u32Baud = 100000; ///< 100K
stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式
stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭
I2C_Init(M0P_I2C0,&stcI2cCfg); ///< 模块初始化
}