Other Parts Discussed in Thread:MSP430F5529
I2C通信是用MSP430F5529作为主机,向外设AD5274(数字电位器)发送两个字节的数据。用的MSP430F55XX系列的例程,只有从机地址改成外设的固定地址。但是开始条件产生后,SDA和SCL都只是被拉低,没有波形的变化,一直到结束条件STP产生后,SDA和SCL空闲拉高。时钟是SMCLK,时钟源用4M的外部晶振,用IO口显示SMCLK,时钟源信号正常。想请教大家有没有碰到这种情况,问题有可能会出在哪里呢?
#include <msp430.h>
unsigned char *PTxData; // Pointer to TX data
unsigned char TXByteCtr;
const unsigned char TxData[] = // Table of data to transmit
{ 0x1C,0x02 };
int main(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0x03; // 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 = 40; // fSCL = SMCLK/40 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x2E; // Slave Address is 048h
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
UCB0IE |= UCTXIE; // Enable TX interrupt
while (1)
{
for(i=0;i<10;i++); // Delay required between transaction
PTxData = (unsigned char *)TxData; // TX array start address
// Place breakpoint here to see each
// transmit operation.
TXByteCtr = sizeof TxData; // Load TX byte counter
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts
__no_operation(); // Remain in LPM0 until all data
// is TX'd
while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
}
}
//——————————————————————————
// The USCIAB0TX_ISR is structured such that it can be used to transmit any
// number of bytes by pre-loading TXByteCtr with the byte count. Also, TXData
// points to the next byte to transmit.
//——————————————————————————
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCI_B0_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(UCB0IV,12))
{
case 0: break; // Vector 0: No interrupts
case 2: break; // Vector 2: ALIFG
case 4: break; // Vector 4: NACKIFG
case 6: break; // Vector 6: STTIFG
case 8: break; // Vector 8: STPIFG
case 10: break; // Vector 10: RXIFG
case 12: // Vector 12: TXIFG if (TXByteCtr) // Check TX byte counter
{
UCB0TXBUF = *PTxData++; // Load TX buffer
TXByteCtr–; // Decrement TX byte counter
}
else
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
UCB0IFG &= ~UCTXIFG; // Clear USCI_B0 TX int flag
__bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
} default: break;
}
}
Susan Yang:
请您使用自己的程序,先连接示波器(而不需要挂载AD5274),然后再启动程序看看,是不是有一瞬间的波形发生,如果是那就是系统检测到线上没有设备或者悬空状态,然后就关闭了IIC。
,
Susan Yang:
另外之前有客户遇到了类似的问题,您可以参考一下
e2echina.ti.com/…/97745
,
Yang Ruo:
我在置位起始条件后,SDA SCL电平会由高到低,但是没有波形,后面还可以进行操作,然后停止条件后,两条线可以恢复到高电平,期间是一直没有波形的。就是不太理解是因为程序原因还是硬件原因导致的没有波形。因为我的上拉电阻是跳线的,会有硬件方面的影响吗?
,
Susan Yang:
若是可以的话,您可以测试下TI例程,看是否成功,从而排除硬件上的问题,如
dev.ti.com/…/node
,
Yang Ruo:
我最初就是用的MSP430F55xx_uscib0_i2c_08.c这个例程,但是SCL SDA没有波形,也没产生中断跳转,这种还是程序问题吗?
,
Susan Yang:
//****************************************************************************** //MSP430F552x Demo - USCI_B0 I2C Master TX multiple bytes to MSP430 Slave // //Description: This demo connects two MSP430's via the I2C bus. The master //transmits to the slave. This is the MASTER CODE. It cntinuously //transmits an array of data and demonstrates how to implement an I2C //master transmitter sending multiple bytes using the USCI_B0 TX interrupt. //ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.045MHz // // ***to be used with "MSP430F55xx_uscib0_i2c_09.c" *** // ///|\/|\ //MSP430F552910k10kMSP430F5529 //slave||master //-----------------||----------------- //-|XINP3.0/UCB0SDA|<-|----+->|P3.0/UCB0SDAXIN|- //||||| //-|XOUT|||XOUT|- //|P3.1/UCB0SCL|<-+------>|P3.1/UCB0SCL| //|||| // //Bhargavi Nisarga //Texas Instruments Inc. //April 2009 //Built with CCSv4 and IAR Embedded Workbench Version: 4.21 //******************************************************************************您是使用2块板子测试的?是否有外接电阻?
,
Yang Ruo:
我是用的一块板子,有上拉电阻10k,没带外设和带外设的情况都试过,都没有波形产生
,
Susan Yang:
请您连接上外设且使用标准的I2C主机程序测试一下,看是否有波形
dev.ti.com/…/node
另外请参考
www.ti.com/…/slaa734a.pdf
,
Yang Ruo:
我启动程序,发送开始条件后,SDA会被拉低,SCL没有变化始终置高,这种是关闭了IIC的情况吗?
,
Susan Yang:
您可以看一下用户指南的USCI Operation – I 2C Mode
Yang Ruo 说:SDA会被拉低,SCL没有变化始终置高
这就是START开始的标志
,
Susan Yang:
另外分享一下网络上很好的I2C的分析,您可以看一下:
zhuanlan.zhihu.com/…/94195531
,
Yang Ruo:
是的,我知道这个是开始标志的正常情况,但是开始标志后SCL和SDA并没有高低电平的变换,一直保持着高电平和低电平,这种情况是什么原因呢?
,
Susan Yang:
这就是表明没有数据传输。您需要连接上从机一起测试的
参考之前的链接:zhuanlan.zhihu.com/…/94195531
2.2 电气特性无法满足
如果正常拉高、拉低的情况下,依然无法正常读取数据。通常建议,根据负载电流更换小阻值的电阻。
,
Yang Ruo:
我连接从机进行测试了,并且把上拉电阻也变成了1k,但是依旧没有数据,还会有什么其他的原因吗?TAT