原来使用LM3S5K31,使用I2C0(PB2 , PB3),外设器件初始化时,需要先把I2C配置成GPIO口,然后利用GPIO模拟I2C发送指令(HELLO),之后重新配置为标准I2C与器件进行通讯。
代码在LM3S5K31上使用无误。现在MCU更换为TM4C1231,代码部分基本不变,系统无法正常运行。
看Datasheet,M4增加了一个GPIO口的“确认控制”。
现在在把PB2和PB3配置成普通GPIO的时候,先进行确认设置更改,当完成HELLO指令后,重新配置成为I2C,但是器件仍然不能正常工作。亲帮忙看看还有什么原因:
/* 解锁IO口 */
HWREG(GPIO_PORTB_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(GPIO_PORTB_BASE + GPIO_O_CR) |= (GPIO_PIN_2 | GPIO_PIN_3); /* bits can be written */
HWREG(GPIO_PORTB_BASE + GPIO_O_LOCK) = 0x0;
/* 将SDA SCL初始化成IO */
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_2);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_3);
/* 调用IO 模拟I2C发送 */
BSP_I2C_GPIO_Start();
BSP_I2C_GPIO_WriteByte(1, &ucData);
BSP_I2C_GPIO_Stop();
/* 重新配置为I2C接口 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
/* 解锁IO口 */
HWREG(GPIO_PORTB_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(GPIO_PORTB_BASE + GPIO_O_CR) |= (GPIO_PIN_2 | GPIO_PIN_3); /* bits can be written */
HWREG(GPIO_PORTB_BASE + GPIO_O_LOCK) = 0x0;
/*将PB3 (65),PB2(72)分别配置给I2C0SDA,I2C0SCL*/
GPIOPinConfigure(GPIO_PB2_I2C0SCL);
GPIOPinConfigure(GPIO_PB3_I2C0SDA);
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_2); //MCU BUG
I2CMasterEnable(I2C0_BASE);
/*配置I2C的时钟周期为100kbps*/
/*false默认选择为100k,true默认选择为400k*/
I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false);