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.
只有一个从设备,是LCD1602. 程序我就是用TI官方例程 msp430g2xx3_uscib0_i2c_08,只是把从地址改了一下。我在SDA和SCL分别接了2个10K的上拉电阻,还有把P1.6下面那个跳线拔了。一共就4根线。SDA,SCL,电源,地线。我把程序停在发送完START语句之后,发现的问题就是
1.SCL第5个脉冲拉的特别长
2.从设备返回NACK
3.它返回了NACK后,SCL一直为低。
4.我用示波器测量时钟频率大概就100HZ
5.我看TI官方例程有点奇怪。在START信号发送之后,什么时候TXIFG会再次产生?
还有这句话
while (1) { PTxData = (unsigned char *)TxData; // TX array start address TXByteCtr = sizeof TxData; // Load TX byte counter while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts // Remain in LPM0 until all data // is TX'd }
为什么整个while(1)? 假设它能发送完数据,还有在用指针指向第一个地址,然后在发一遍?
谢谢了~
你好,
建议换一个I2C从机试一下,比如直接两个430launchpad用I2C通信。
关于第5个问题,TXIFG信号会在TXBUF发送完成之后产生。
关于最后一个问题:while(1)语句的最后让430进入了LPM模式,进入I2C中断并退出之后依然会进入LPM模式,而不是
PTxData = (unsigned char *)TxData;这一句。只有当字符串的数据发送完之后才会在中断中调用 __bic_SR_register_on_exit(CPUOFF); 退出LPM模式,这时才会执行PTxData = (unsigned char *)TxData;重新将指针指向数组开头。
你好,
我手上只有一个launchpad,但是我换了个主设备,lpc1768,它是可以使那个LCD显示的。
那这个函数的功能就是 发完一个数组里的数据出去后 ,然后在发一遍,一直循环吗?
你好,
你的理解没错,这段代码功能就是不断发送数组中的内容。关于换个主设备就可以的问题,我觉得可能还是在编程上,方便的话能不能把初始化以及发送数据的代码post出来?
你好:
时钟源我还有个问题,SMCLK系统默认是1Mhz,想要100Khz,为什么官方例程要除以12呢?
下面是代码了。
void I2C_Init(uchar SlaveAddress)
{
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = SlaveAddress;
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
}
void I2C_WriteMode(void)
{
IFG2 &=~ UCB0TXIFG;
IE2 &=~ UCB0RXIE;
IE2 |= UCB0TXIE;
UCB0CTL1 |= UCTR;
}
void I2C_TxByte(uchar* TxData,uint len)
{
I2C_WriteMode();
PTxData = (uchar *)TxData; // TX array start address
TxByteCtr = len;
UCB0CTL1 |= UCTXSTT;
__bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
}
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
if (TxByteCtr) // Check TX byte counter
{
UCB0TXBUF = *PTxData++; // Load TX buffer
TxByteCtr--;
}
else
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
IFG2&=~UCB0TXIFG; // Clear USCI_B0 TX int flag
//IE2 &=~UCB0TXIE;
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
}
首先你所说的的1M其实是一个大概值,在430上电时候SMCLK的时钟源默认是DCO~1.1Mhz,但是DCO会受很多因素的影响,比如温度等,我们所说的100khz其实是一个大概值,所以说进行12分频。