您好!
我正在尝试 以 从模式(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 总线?


