This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我使用的是 TM4C1294NCPDT 微控制器、我有一个可通过 I2C 配置的从 IC。 下面是我用来配置和读取从器件 ID 的代码。
void I2C_Init(){ //启用 I2C 模块1 SysCtlPeripheralEnable (SYSCTL_Periph_I2C1); //复位模块 SysCtlPeripheralReset (SYSCTL_Periph_I2C1); //启用包含 I2C 1的 GPIO 外设 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG); //为端口 B2和 B3上的 I2C0功能配置引脚复用。 GPIOPinConfigure (GPIO_PG0_I2C1SCL); GPIOPinConfigure (GPIO_PG1_I2C1SDA); //为这些引脚选择 I2C 功能。 GPIOPinTypeI2CSCL (GPIO_PORTG_BASE、GPIO_PIN_0); GPIOPinTypeI2C (GPIO_PORTG_base、GPIO_PIN_1); //启用并初始化 I2C1主机模块。 使用的系统时钟 // I2C1模块。 最后一个参数设置 I2C 数据传输速率。 //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为 //设置为400kbps。 I2CMasterInitExpClk (I2C1_base、(SysCtlClockGet ())、true); //清除 I2C FIFO HWREG (I2C1_base + I2C_O_FIFOCTL)= 80008000; } uint32_t I2C_read (uint8_t slave_addr、uint8_t reg) { uint32_t ERROR = 0; //指定我们正在向从器件写入(寄存器地址) I2CMasterSlaveAddrSet (I2C1_base、slave_addr、false); //指定要读取的寄存器 I2CMasterDataPut (I2C1_base、reg); //将控制字节和寄存器地址字节发送到从器件 I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START); //等待 MCU 完成事务 while (I2CMasterBusy (I2C1_base)); 错误= I2CMasterErr (I2C1_base); //指定我们将从从从器件读取 I2CMasterSlaveAddrSet (I2C1_base、slave_addr、true); //发送控制字节并从我们指定的寄存器中读取 I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_Receive); //等待 MCU 完成事务 while (I2CMasterBusy (I2C1_base)); //返回从指定寄存器提取的数据 返回 I2CMasterDataGet (I2C1_base); }
从器件地址为0xCE、当我将此作为参数传递给读取函数时、我没有读取 ID、因此探测了 SCL 和 SDA 线路。
发现示波器捕获的从地址为0x9C、但我配置的是0xCE。 因此、从器件可能不会被确认。
上拉电阻器存在、SCL/SDA 看起来很干净。
上述代码是否存在任何问题? 我在哪里错误配置总线?
谢谢、
Janardan
您好!
您要连接的从 IC 器件是什么? 您能否共享您的从器件 I2C 数据表?
请注意、I2C 从地址是一个7位地址。 这意味着您只能具有0-127之间的地址。 当您说从地址为0xCE 时、它已经超过128。
当从器件地址被驱动到总线时、它被左移1。 在示波器上看到的总线上的位0是事务的方向(读取或写入)。 在确定从器件地址时、不应考虑总线上的位0。 我猜您的从 I2C 器件地址是0x67。 如果您将0x67左移1位、将得到0xCE。
尝试使用从地址0x67并查看它是否起作用。