期间用了msp430提供的历程 ,下载运行也会停在while (!(UCB0IFG & UCTXIFG)),用超时机制跳过,重新开始 ,抓取到的波形如下:
只要发起开始信号,SCL就自然变为低电平。
附件是源码
GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P5, GPIO_PIN2 + GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION ); /* * Disable the GPIO power-on default high-impedance mode to activate * previously configured port settings */ PMM_unlockLPM5(); __delay_cycles(1000); UCB0CTLW0 |= UCSWRST;// Software reset enabled UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC; // I2C mode, Master mode, sync UCB0CTLW0 |= UCSSEL_2 ; // Use SMCLK, keep SW reset UCB0BRW = 10; // fSCL = SMCLK/10 = ~100kHz UCB0I2CSA = slaveAddress; // Slave Address is 048h UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation void I2C_write(unsigned char *TX_buffer, int writeLength) { int i = 0; /* Clear USCI_B0 TX interrupt flag */ UCB0IFG &= ~UCTXIFG; // while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent // Set UCB0 as I2C's TX mode, and send a START condition // This will also send out the slave address UCB0CTL1 |= UCTR | UCTXSTT; //Send the number of "writeLength" bytes out for (i = 0; i < writeLength; i++) { /* Wait for TX buffer to empty */ while (!(UCB0IFG & UCTXIFG)); /* Send pointer byte */ UCB0TXBUF = *TX_buffer++; } while (!(UCB0IFG & UCTXIFG)); /* Generate Stop condition */ UCB0CTL1 |= UCTXSTP; /* Wait for Stop to finish */ while (UCB0CTL1 & UCTXSTP); }
’