您好!
我正在尝试 以 从模式(BeagleBoneBlack - BBB 为主设备)启动 MSP430FG6426上的 I2C 外设。
我知道:
1.我可以 在 BBB 上使用"i2cdetect -y 1"来检测 MSP 和总线上的其他器件。
2.我可以 在同一 I2C 总线上将数据从另一个器件传输到 BBB。
3.当我执行读操作时,我会得到 下面的字符。 "`abcdpqrst"是我期望的字符、我再一次像预期的那样得到正好为64字节的字符。
Address: 0x55 rx_len: 64 Data: `abcdpqrst`abcdpqrst`abcdpqrst`abcdpqrst`abcdpqrst`abcdpqrst`abc omap_i2c 4802a000.i2c: controller timed out Error: Connection timed out (os error 110) omap_i2c 4802a000.i2c: timeout waiting for bus ready Error: Connection timed out (os error 110)
4.从示波器上 可以清楚地看到 SCL 和 SDA 都被拉低。 我将 MSP SCL & SDA 复位至3.29V 的这一刻、表明实际上 MSP 使 它保持在低电平。
5.我将对 TI 编译器 v21.6 LTS 使用稍作修改的 driverlib 示例代码(USCI_B_i2c_ex4_slaveTxMultiple.c)。 最大的修改:1. 它并不是单独的(while 循环不在这里)、2. 我正在使用 USCI_B1。 为清楚起见、此处是此演示文稿中
#define SLAVE_ADDRESS 0x55 #define TXLENGTH 0x09 uint8_t transmitData[] = { 0x60, 0x61, 0x62, 0x63, 0x64, 0x70, 0x71, 0x72, 0x73, 0x74}; uint8_t *transmitDataPointer; uint8_t transmitLength = TXLENGTH; //38.3.4.1.1 I2C Slave Transmitter Mode void i2c_init(void) { //Assign I2C pins to USCI_B1 GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P8, GPIO_PIN5 + GPIO_PIN6); //Initialize I2C as a slave device USCI_B_I2C_initSlave(USCI_B1_BASE, SLAVE_ADDRESS); //Set in transmit mode USCI_B_I2C_setMode(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_MODE); //Enable I2C Module to start operations USCI_B_I2C_enable(USCI_B1_BASE); //Enable master transmit interrupt USCI_B_I2C_clearInterrupt(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT + USCI_B_I2C_STOP_INTERRUPT); USCI_B_I2C_enableInterrupt(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT + USCI_B_I2C_STOP_INTERRUPT); transmitDataPointer = transmitData; transmitLength = TXLENGTH; //Enter low power mode 0 with interrupts enabled. // __bis_SR_register(LPM0_bits + GIE); // __no_operation(); } //****************************************************************************** // //This is the USCI_B1 interrupt vector service routine. // //****************************************************************************** #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=USCI_B1_VECTOR __interrupt #elif defined(__GNUC__) __attribute__((interrupt(USCI_B1_VECTOR))) #endif void USCI_B1_ISR(void) { uint16_t iv = UCB1IV; USCI_A_UART_transmitData(USCI_A0_BASE, iv + 0x61); switch (__even_in_range(iv, 12)) { case USCI_I2C_UCSTPIFG: //Exit LPM0 if data was transmitted __bic_SR_register_on_exit(LPM0_bits); break; case USCI_I2C_UCTXIFG: //Transmit data //if (transmitLength > 0x00) { USCI_B_I2C_slavePutData(USCI_B1_BASE, *transmitDataPointer++); //transmitLength--; if (transmitDataPointer >= (transmitData+10)) { transmitDataPointer = transmitData; } } break; default: break; } }
Question:
SCL 和 SDA 为何都被拉至低电平?
2.我怎么能分别向师父指出我没有什么可发送的? 我是只 发送0x0还是0x20、是否在另一端发送、这应该意味着我不应该再询问?
3.是否有办法强制 MSP 释放 I2C 总线?