首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

使用MSP430的IIC模块,无时钟信号有关问题

2013-06-19 
使用MSP430的IIC模块,无时钟信号问题使用msp430F5529的IIC模块 SCL无时钟输出,这个问题可能出现在什么地方

使用MSP430的IIC模块,无时钟信号问题
使用msp430F5529的IIC模块 SCL无时钟输出,这个问题可能出现在什么地方??
使用msp430F5529的IIC模块,控制一个数字电阻器DS1803,将P3.0(UCB0IICSDA)和P3.1(UCB0IICSCL)与ds1803的对应管脚连接,同时通过上拉电阻连接DVCC(3.3V),按照示例程序,修改从机地址和发送内容,完全没响应。
用示波器查看,3.1没有时钟输出,只有开始时候跳变到底,这是个什么情况?

有大神能帮帮忙吗,调了3天了,查到了一些问题,但是无助于结果啊?

程序如下:


#include "msp430x552x.h"
unsigned char *PTxData;                     // Pointer to TX data
unsigned char TXByteCtr;

const unsigned char TxData[] =              // Table of data to transmit
{ 0xA9,0xFB  };                               // 这里的发送内容做了改动

void 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 = 12;                             // fSCL = SMCLK/12 = ~100kHz
 UCB0BR1 = 0;
 UCB0I2CSA = 0x29;                         // Slave Address is 048h
 //从地址由示例程序更改。由此确定start后的首字节为0x53,01010011,1-7位为从地址,0位为R/W位。
 UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
 UCB0IE |= UCTXIE + UCNACKIE;                         // Enable TX interrupt


 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
   
 while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent


 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
}

//------------------------------------------
// 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.
//------------------------------------------
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
 switch(__even_in_range(UCB0IV,12))
 {
 case  0: break;                           // Vector  0: No interrupts
 case  2: break;                           // Vector  2: ALIFG
 case  4:
   __no_operation();
   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;
 }
}


[解决办法]
if?(TXByteCtr)??????????????????????????//?Check?TX?byte?counter

能发启动信号,那跟踪到这行的时候,看看这个的值

如果和你说的仅仅改动了那几个地方的话,我觉得可能是这个值出了问题

热点排行