主题中讨论的其他器件: ADS7924
您好!
希望这是某人以前可能遇到的代码问题。 我可以使用从器件(运行 CCS v7.1.0.00016调试器、无 RTOS、使用 TM4C129ENCZAD 主器件和从器件 IIS2DH)通过 I2C 成功读取各种控制和状态寄存器。
当我写入从器件上的其中一个控制寄存器(例如 CTRL_REG1)、然后读回新状态时、将返回原始(加电默认值)值、而不是刚写入的新值。
该寄存器的上电默认值为0x07。 对于我提出的任何写操作、它都不会改变。 在研究了此处的论坛之后、现在请在本帖子的末尾插入代码。
代码首先读取 ctrl1的当前(默认值0x07)状态。 然后、一个新值(0x23)被写入 ctrl1。 最后、回读 ctrl1的新状态。
问题:
1) 1)对控制寄存器的写入似乎不被器件锁存。 这可能是器件问题、而不是代码问题、但我想知道它是否属于我到达的写入序列(请参阅下面的代码...)
2) 2)最后一次读取操作重复2次。 不知道为什么。
以下屏幕截图显示了在上述3个操作中通过 I2C SDA/SCL 传输的位序列。
可以看到、ctrl1的状态不会因写入操作而改变 最后的读取操作重复2次。
以下是代码:
//程序 CTRL_REG1[7:4]至0111 - 400Hz HR/正常/低功耗模式(def = 0000 - PowerDn) //读取 CTRL_REG1 的当前状态 SlaveAddress = 32;//CTRL_REG1地址(x20) //SlaveAddress = 15;//whoami 地址(x0F) I2CMBQ_REG1地址(x20)/ADDRBb = 15;// DSCL DAL_CL_CL_ADDR_CL_CL_CL_CLB (FALSE );/ADC1000 (USC129_ADDR_CL_CL_CL_CL_CL_CL_CL_CL_CLB = //设置忙标志(来自 TI 论坛的 TM4C129延迟问题。 不执行此操作、后续代码步骤将无法可靠地工作!!!) //while (!(I2CMasterBusy (I2C2_base))); while (I2CMasterBusy (I2C2_base)); I2CMasterDataPut (I2C2_base、SlaveAddress); I2CMasterControl (I2C2_base、I2C_MASTER_CMD_SINGLE_SEND); SysCtlDelay (1000); //允许设置忙标志(TM4C129问题) // while (!(I2CMasterBusy (I2C2_base)); while (I2CMasterBusy (I2C2_base)); I2CMasterSlaveAddrSet (I2C2_base、Board_FBB_TM4C129_ACCEL_RATE_ADDR);TRUE; //true =读取 SysCtlDelay (1000);//允许设置忙标志(TM4C129问题) // while (!(I2CMasterBusy (I2C2_base))); while (I2CMasterBusy (I2C2_base)); I2CMasterControl (I2C2_base、I2C_MASTER_CMD_SINGLE_Receive); SysCtlSlaveDelay (1000);//允许设置忙标志(TM4C129问题) // while (!(I2CMasterBusy (I2C2_base))); while (I2CMasterData_RegBusy (I2C2_CR_BASE ) = 0x2CMST_DR_012_CL_DR_ST_012_CL_CL_ST_CL_CL_CL_CLUS_CLB = 0x2 (I2CMST_CL_CL_CL_CL_CL_CL_CL_CL_CL_STAT_1);[I2USB_CL_CL_1 = 0xCMST_CL_SL_CL_SL_CL_STAT_0 = 0x2 * 0 = 0x2 Slav_CL_CL_CL_CL_CL_CL_CL_CL_CL_STAT_1;TM2_1 (I1_CL_CL_CL_CL_CL_CL_CL_CL_CL_CL_CL_CL_CL_1 当 I2CMasterControl (I2C2_base、I2C_MASTER_CMD_SINGLE_SEND)运行 SysCtlDelay (1000)时、此传输正确;//允许设置忙标志(TM4C129问题) //while (!(I2CMasterBusy (I2C2_base))); while (I2CMasterBusy (I2CMasterBusy)(IC2);IC2 (base); I2CMasterDataPut (I2C2_base、SlaveAddress); I2CMasterControl (I2C2_base、I2C_MASTER_CMD_SINGLE_SEND); SysCtlDelay (1000); //允许设置忙标志(TM4C129问题) // while (!(I2CMasterBusy (I2C2_base)); while (I2CMasterBusy (I2C2_base)); I2CMasterDataPut (I2C2_base);//写入更新后的 I2CMasterBusy (I2C2_Base_D+/I2CMC129_BASE );/I2CM2CMasterC129_CC2CL_RESH (I2CM24_CL_RESH);/I2CM24_CL_CL_CL_CL_CL_RESH (I2CM24_CL_CL_CL_RESH (I2USB_RESH);/I2CM24_CL_CL_RESH (I2USB_RESH) SysCtlDelay (1000);//允许设置忙标志(TM4C129问题) // while (!(I2CMasterBusy (I2C2_base))); while (I2CMasterBusy (I2C2_base)); I2CMasterDataPut (I2C2_base、SlaveAddress); I2CMasterControl (I2C2_base、I2C_MASTER_CMD_SINGLE_SEND); SysCtlDelay (1000); //允许设置忙标志(TM4C129问题) // while (!(I2CMasterBusy (I2C2_base)); while (I2CMasterBusy (I2C2_base)); I2CMasterSlaveAddrSet (I2C2_base、Board_FBB_TM4C129_ACCEL_ADDR、true);//true =读取。 SysCtlDelay (1000);//允许设置忙标志(TM4C129问题) // while (!(I2CMasterBusy (I2C2_base))); while (I2CMasterBusy (I2C2_base)); I2CMasterControl (I2C2_base、I2C_MASTER_CMD_SINGLE_Receive); SysCtlDelay (1000);//允许设置忙标志(TM4C129问题) // while (!(I2CMasterBusy (I2C2_base))); while (I2MasterasterVerify DataBusy (I2C2_base );I2CMST_CL_STATE_1 (I2CMTCL_CL_SL_STAT_1);I2PRIVE_CL_STATE_1 (I2_CL_1) { System_printf ("I2C RD/WR 至 CTRL_Reg1错误"); 返回0; }
阅读、重新阅读并再次阅读 I2C 从设备外设的用户指南。 未提及用于启用寄存器更改的特殊命令。 我发布到该器件的技术支持网站、但尚未收到任何反馈。 希望在我的代码中出现错误。
提前感谢您。