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.
你(们)好
我想在我的微控制器上阅读 TI 温度传感器 TMP117的寄存器。 下图显示了所需的行为:
这是我的 init()函数。 当我看到 I2C 线路上的一些行为时,我猜它是有效的。
void I2C_init(void) { // Enable the I2C0 peripheral MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1); I2CMasterEnable(I2C1_BASE); SysCtlPeripheralReset(SYSCTL_PERIPH_I2C1); SysCtlPeripheralReset(SYSCTL_PERIPH_I2C1); // Wait for the I2C0 module to be ready. while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C1)) { } MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // Configure the GPIO Pin Mux for PA6 for I2C1SCL MAP_GPIOPinConfigure(GPIO_PA6_I2C1SCL); MAP_GPIOPinTypeI2CSCL(GPIO_PORTA_BASE, GPIO_PIN_6); // Configure the GPIO Pin Mux for PA7 for I2C1SDA MAP_GPIOPinConfigure(GPIO_PA7_I2C1SDA); MAP_GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_7); // Initialize Master and Slave I2CMasterInitExpClk(I2C1_BASE, SysCtlClockGet(), false); while(I2CMasterBusBusy(I2C1_BASE)) { } }
我希望使用以下代码:
uint32_t I2C_readThisRegister() { uint8_t slaveAddress = 0b10010010; uint32_t registerToRead = 0x00001111; //------WRITE-Section---------------------------------------- I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, false); I2CMasterDataPut(I2C1_BASE, registerToRead); I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START); while(I2CMasterBusBusy(I2C1_BASE)) { } //------READ-Section---------------------------------------- I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, true); // set slave address //read first Byte I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT); while(I2CMasterBusBusy(I2C1_BASE)) { } uint32_t msb=I2CMasterDataGet(I2C1_BASE); //read second Byte I2CMasterControl( I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH); while(I2CMasterBusBusy(I2C1_BASE)) { } uint32_t lsb=I2CMasterDataGet(I2C1_BASE); return ((msb << 8)| lsb); }
示波器显示仅执行写入零件。 时钟在读取部分不工作。 看起来读取部分被忽略。
我已经尝试过不同的变量,但我无法读取这些值。
PS:示例中的地址不是特别有用。 一旦 I2C 接口工作正常,我会添加代码,以便它能正确驱动传感器。
感谢你的帮助! 非常感谢!
此致
爱国者
你(们)好
[引用 userid="291946" url="~ë/support/icros/arm-based 微处理器-组/基于 ARM 的微控制器/f/arm-based 微控制器- forum/1069803/tm4c123ghrpm -读-自回温度传感器-tmp117-use-i2c"]阅读部件中的时钟不工作。 看起来已读部件被忽略。您能否显示整个操作的范围上限? 您的意思是时钟不工作?
请参阅以下可能有帮助的示例。
C:\ti\TiaWare_C_Series-2.2.0.295\examples\boards\EK-tm4c123gxl-bootstxl-sushub\湿度_shtml_simple
尊敬的查尔斯
感谢您的推荐。 我必须复制了错误的命令。它们看起来类似。 除此之外,i2c 地址的长度为8位,而不是7位。 如果其他人有类似问题,我将在下面发布工作代码。
init()
uint32_t I2C_init(void) { // Enable the I2C0 peripheral MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1); I2CMasterEnable(I2C1_BASE); SysCtlPeripheralReset(SYSCTL_PERIPH_I2C1); SysCtlPeripheralReset(SYSCTL_PERIPH_I2C1); // Wait for the I2C0 module to be ready. while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C1)) { } MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // Configure the GPIO Pin Mux for PA6 for I2C1SCL MAP_GPIOPinConfigure(GPIO_PA6_I2C1SCL); MAP_GPIOPinTypeI2CSCL(GPIO_PORTA_BASE, GPIO_PIN_6); // Configure the GPIO Pin Mux for PA7 for I2C1SDA MAP_GPIOPinConfigure(GPIO_PA7_I2C1SDA); MAP_GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_7); // Initialize Master and Slave I2CMasterInitExpClk(I2C1_BASE, SysCtlClockGet(), false); while(I2CMasterBusBusy(I2C1_BASE)) { } return 0; }
向寄存器写入16位的函数:
uint32_t I2C_write16BitRegister(uint8_t slaveAddress, uint32_t addressPointer, uint8_t firstByte, uint8_t secondByte) { I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, false); I2CMasterDataPut(I2C1_BASE, addressPointer); // pointer auf Unlock register I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START); while(I2CMasterBusy(I2C1_BASE)) { } I2CMasterDataPut(I2C1_BASE, firstByte); // Bit 15 setzen I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); while(I2CMasterBusy(I2C1_BASE)) { } I2CMasterDataPut(I2C1_BASE, secondByte); I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH); while(I2CMasterBusy(I2C1_BASE)) { } return 0; }
函数写入地址指针,然后读取两个字节:
uint32_t I2C_read16BitRegister(uint8_t slaveAddress, uint8_t registerAddress) { /* * Einzelne Schreibaktion spricht den Sensor an und * stellt den Address-Pointer des Sensors auf jenes Register, * welches im zweiten Teil gelesen werden soll. */ I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, false); // set slave address I2CMasterDataPut(I2C1_BASE, registerAddress); // set register to be read I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND); while(I2CMasterBusy(I2C1_BASE)) { } /*---------------------------------READ-Section---------------------------------------- * Hier zwei Bytes im Burstmode auslesen und zusammensetzen */ I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, true); // set slave address //read first Byte I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START); while(I2CMasterBusy(I2C1_BASE)) { } uint32_t msb=I2CMasterDataGet(I2C1_BASE); //read second Byte I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH); while(I2CMasterBusy(I2C1_BASE)) { } uint32_t lsb=I2CMasterDataGet(I2C1_BASE); return ((msb << 8) | lsb); }
感谢你的帮助。
此致