在线情况
楼主
  • 头像
  • 级别
    • 积分5
    • 经验245
    • 文章3
    • 注册2012-11-15
    msp430F5438A 硬件IIC问题请教
    [P]void Init_iic (void)[/P][P]{ [/P][P]  P9DIR |=0X06;[/P][P]  P9SEL |= 0x06;                            // Assign I2C pins to USCI_B2[/P][P]  UCB2CTL1 |= UCSWRST;                      // 启用SW复位[/P][P]  UCB2CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C主,同步模式[/P][P]  UCB2CTL1 = UCSSEL_2 ;                     // 使用SMCLK[/P][P]  UCB2BR0 = 213;                             // fSCL = SMCLK/12 = ~100kHz[/P][P]  UCB2BR1 = 0;[/P][P]  UCB2I2CSA = 0x64;                         // 从地址[/P][P]  UCB2CTL1 &= ~UCSWRST;                     // 清除复位SW,恢复运行[/P][P]  UCB2IE |= UCRXIE;                         // 启用RX中断[/P][P]}[/P][P]   [/P][P]/**********************向相关的存储单元写入数据**************************/  [/P][P]void EEPROM_Write(uchar sla,uchar suba,uchar *s,uchar no)  [/P][P]{  [/P][P]  while (UCB2CTL1 & UCTXSTP);                 // 确定总线空闲  [/P][P]  UCB2CTL1 |= UCTXSTT + UCTR;                // 发送起始位,确定为发送模式  [/P][P]  UCB2TXBUF = (sla);                         // 发送高位地址  [/P][P]  while((UCB2IFG & UCTXIFG)==0);             // 判断是否发送完毕  [/P][P]  UCB2TXBUF = (suba);                         // 发送低位地址  [/P][P]  while((UCB2IFG & UCTXIFG)==0);            // 判断是否发送完毕  [/P][P]  UCB2TXBUF = (*s);                        // 发送数据  [/P][P]  while((UCB2IFG & UCTXIFG)==0);            // 判断是否发送完毕  [/P][P]  UCB2CTL1 |= UCTXSTP;                      // 发送停止位  [/P][P]  while((UCB2CTL1 & UCTXSTP)==1);           // 判断停止位是否发送完毕  [/P][P]}  [/P][P]  [/P][P]/***********************字节读函数 连续读发送设置 *********************************/  [/P][P]void EEPROM_read()  [/P][P]{  [/P][P]  UCB2CTL1 &= ~UCTR;                       // 确定为读  [/P][P]  while (UCB2CTL1 & UCTXSTP);              // 总线是否空闲  [/P][P]  UCB2CTL1 |= UCTXSTT;                     // 发送开始位  [/P][P]}  [/P][P]  [/P][P]/*******************字节写函数 **********随机读发送设置 *************************/  [/P][P]void EEPROM_radom(unsigned char high_Address,unsigned char low_Address)  [/P][P]{  [/P][P]  while (UCB2CTL1 & UCTXSTP);               // Ensure stop condition got sent  [/P][P]  UCB2CTL1 |= UCTXSTT + UCTR;               // 发送起始位,确定为写  [/P][P]  UCB2TXBUF = high_Address;                 // 发送地址位高位  [/P][P]  while((UCB2IFG & UCTXIFG)==0);            // 判断是否发送完毕  [/P][P]  UCB2TXBUF = low_Address;                  // 发送地址位低位  [/P][P]  while((UCB2IFG & UCTXIFG)==0);            // 判断是否发送完毕  [/P][P]  UCB2CTL1 &= ~UCTR;                        // 确定为接收  [/P][P]  while (UCB2CTL1 & UCTXSTP);               // 判断总线是否被释放  [/P][P]  UCB2CTL1 |=UCTXSTT;                       // 重新发送起始位  [/P][P]  while((UCB2CTL1 & UCTXSTT)==1);           // 判断起始位是否发送成功  [/P][P]  for(unsigned char i=0x0;i<0x2f;i++);      // 延时确定数据已经被发送出去  [/P][P]  UCB2CTL1 |=UCTXSTP + UCTXNACK;            // 发送停止位和NACK位  [/P][P]}  [/P][P]  [/P][P]/********************接收中断函数 **********存取接收的数据 ******************************/  [/P][P]#pragma vector = USCI_B2_VECTOR  [/P][P]__interrupt void USCIAB2_ISR(void)  [/P][P]{  [/P][P]  if(UCB2IFG  & UCRXIFG)                     // 接收中断  [/P][P]  {  [/P][P]   count++;  [/P][P]   RXData = UCB2RXBUF;  [/P][P]  }  [/P][P]}  [/P][P]
    [/P][P]
    [/P][P]
    [/P][P]
    [/P][P]
    [/P][P]程序一直会在[SIZE=9pt]while((UCB2IFG & UCTXIFG)==0);         过不去。求大神速帮忙分析下。[/SIZE][/P]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    你是全速进行调试还是单步调试?
    如果是单步仿真的话,IIC是无法让你在这些微小的时序当中让等待的查看的。[P]如果是全速运行卡在这里可能需要另找原因了。[/P]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    Powered by LeadBBS 9.2 .
    Page created in 0.6250 seconds with 5 queries.