您好!
在系统时钟设置为 SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_INT | SYSCTL_XTAL_16MHz)的情况下使用 I2C 时获得的值正常工作、但当我将系统时钟增加到80MHz 时、通信仍然存在、但值会消失。 对我来说没有意义、因为 I2C 时钟线的时钟速度仍然设置为100kbps。
SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);//将时钟设置为80MHz
//初始化 I2C 模块0 void InitI2C0 (void) { //启用 I2C 模块0 SysCtlPeripheralEnable (SYSCTL_Periph_I2C0); //复位模块 SysCtlPeripheralReset (SYSCTL_Periph_I2C0); //启用包含 I2C 0的 GPIO 外设 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); //为端口 B2和 B3上的 I2C0功能配置引脚复用。 GPIOPinConfigure (GPIO_PB2_I2C0SCL); GPIOPinConfigure (GPIO_PB3_I2C0SDA); //为这些引脚选择 I2C 功能。 GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2); GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3); //启用和初始化 I2C0主机模块。 使用的系统时钟 // I2C0模块。 最后一个参数设置 I2C 数据传输速率。 //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为 //设置为400kbps。 I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet (),false); } //在从器件 uint8_t I2CReceive(uint8_t slave_addr、uint8_t reg) 上读取指定寄存器{ while (I2CMasterBusy (I2C0_BASE)); //指定我们要向写入(寄存器地址) //从器件 I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、false); //指定要读取的寄存器 I2CMasterDataPut (I2C0_BASE、reg); //将控制字节和寄存器地址字节发送到从器件 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START); //等待 MCU 完成事务 while (I2CMasterBusy (I2C0_BASE)); //指定我们将从从从器件读取 I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、TRUE); //发送控制字节并从我们的寄存器中读取 //specified I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive); //等待 MCU 完成事务 while (I2CMasterBusy (I2C0_BASE)); //返回从指定寄存器提取的数据 返回 I2CMasterDataGet (I2C0_BASE); } void I2C_send (uint8_t slave_addr、uint8_t reg、uint8_t data) { while (I2CMasterBusy (I2C0_BASE)); I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、false); //在从器件上发送寄存器地址 I2CMasterDataPut (I2C0_BASE、reg); I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START); while (I2CMasterBusy (I2C0_BASE)); I2CMasterDataPut (I2C0_BASE、DATA); I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH); while (I2CMasterBusy (I2C0_BASE)); }