6552|12

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

各位大神帮忙,MSP430G2553的IIC程序,在线等 [复制链接]

单步仿真都能过,但是F5直接运行会停在  while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空 ,查看标志位IFG2 = 0x82,发送数据后,UCB0TXIFG标志被清零。
请各位大神帮忙,在线等!!!感谢!!!!!


void I2C_Init(void)
{
  WDTCTL = WDTPW + WDTHOLD;              //关闭看门狗定时器
  P1SEL |= (BIT6 + BIT7);                // P1.6 = SCL, P1.7=SDA
  P1SEL2 |= (BIT6 + BIT7);               // P1.6 = SCL, P1.7=SDA

  // Assign I2C pins to USCI_B0
  UCB0CTL1 |= UCSWRST;                   //复位
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;  //主模式+IIC模式+同步模式
  UCB0CTL1 |= UCSSEL_2 + UCSWRST;        //SMCLK+复位
  UCB0BR0 = 10;                          //时钟分频设置(UCBxBR0 + UCBxBR1 × 256)
  UCB0BR1 = 0;
  UCB0I2CSA = (0x50>>1);                 //7位地址
  UCB0CTL1 &= ~UCSWRST;                  //清复位标志
  __delay_cycles(20000);
  __delay_cycles(20000);
}

void I2C_write(unsigned char WriteValH,unsigned char WriteValL)
{
  I2C_Init();
  UCB0I2CSA = (0x50>>1);
  while(UCB0CTL1 & UCTXSTP);            //If ICC Stop
  UCB0CTL1 |= UCTR;
  UCB0CTL1 |= UCTXSTT;           //IIC Start + Write


  //while((IFG2 & UCB0TXIFG) != UCB0TXIFG); //判断UCB0TXBUF是否为空
  //UCB0TXBUF = 0x50;                     //Send X9119 Address
  //UCB0I2CSA = (0x50>>1);

  //while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
  //__delay_cycles(1000);
  //__delay_cycles(1000);
  //__delay_cycles(1000);
  //__delay_cycles(1000);
  while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
  UCB0TXBUF = 0xA0;                     //Send X9119 Write

  while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);

  while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
  UCB0TXBUF = WriteValH;                //Send H
  while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);

  while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
  UCB0TXBUF = WriteValL;                //Send L
  while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);

  UCB0CTL1 |= UCTXSTP + UCTXNACK;        //IIC Stop + NACK
  //UCB0CTL1 |= UCTXSTP ;                  //IIC Stop
  while((UCB0CTL1 & UCTXSTP) == 1);
}

最新回复

您好,请问这个代码范例是哪儿找的?官方出的吗?   详情 回复 发表于 2014-10-28 19:39
 
点赞 关注

回复
举报

6

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
不应该是延时时间不够吧,DCO=1MHZ,__delay_cycles(20000);应该够了啊
单步调试都能调通,检查从机状态也是正确的
就是F5直接运行就卡在
while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
小弟判断有可能是从机没有返回ACK,但是为什么单步都能通过呢?
求帮忙啊
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

板凳
 
是这样的,只要数据移入发送缓存这个TXIFG就会清空

点评

The UCBxTXIFG bit is set when the START condition is generated and the first data to be transmitted can be written into UCBxTXBUF. 是这句话吧,我是新手,请多帮忙  详情 回复 发表于 2013-6-7 14:00
 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

4
 
初始化的时候,手动清除一遍。

点评

清IFG2?  详情 回复 发表于 2013-6-7 13:58
 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

5
 
呵呵,感谢,是这样的,但是数据发送完成后,从机返回ACK后,UCB0TXIFG会重新置1
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼 wstt 的帖子

清IFG2?
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 板凳 wstt 的帖子

The UCBxTXIFG bit is set when the START condition is generated and the first data to be
transmitted can be written into UCBxTXBUF.
是这句话吧,我是新手,请多帮忙

点评

这个没错  详情 回复 发表于 2013-6-7 15:09
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

8
 

回复 7楼 xtsoaa03122 的帖子

这个没错

赞赏

1

查看全部赞赏

 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

9
 
  1. #include "msp430g2553.h"

  2. const unsigned char Sine_Tab[] =            // 16 Point 16-bit Sine Table
  3. {
  4.   0xFF,                                     // MSB Word 0
  5.   0xFF,                                     // LSB
  6.   0xF6,                                     // MSB Word 1
  7.   0x40,                                     // LSB
  8.   0xDA,                                     // MSB Word 2
  9.   0x81,                                     // LSB
  10.   0xB0,                                     // MSB Word 3
  11.   0xFA,                                     // LSB
  12.   0x7F,                                     // MSB Word 4
  13.   0xFF,                                     // LSB
  14.   0x4F,                                     // MSB Word 5
  15.   0x03,                                     // LSB
  16.   0x25,                                     // MSB Word 6
  17.   0x7C,                                     // LSB
  18.   0x09,                                     // MSB Word 7
  19.   0xBD,                                     // LSB
  20.   0x00,                                     // MSB Word 8
  21.   0x00,                                     // LSB
  22.   0x09,                                     // MSB Word 9
  23.   0xBD,                                     // LSB
  24.   0x25,                                     // MSB Word 10
  25.   0x7C,                                     // LSB
  26.   0x4F,                                     // MSB Word 11
  27.   0x03,                                     // LSB
  28.   0x7F,                                     // MSB Word 12
  29.   0xFE,                                     // LSB
  30.   0xB0,                                     // MSB Word 13
  31.   0xFA,                                     // LSB
  32.   0xDA,                                     // MSB Word 14
  33.   0x81,                                     // LSB
  34.   0xF6,                                     // MSB Word 15
  35.   0x40                                      // LSB
  36. };

  37. void main(void)
  38. {
  39.   WDTCTL = WDTPW + WDTHOLD;                 // Stop Watchdog Timer
  40.   P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  41.   P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  42.   UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  43.   UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  44.   UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  45.   UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  46.   UCB0BR1 = 0;
  47.   UCB0I2CSA = 0x4c;                         // Set slave address
  48.   UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  49.   IE2 |= UCB0TXIE;                          // Enable TX ready interrupt
  50.   UCB0CTL1 |= UCTR + UCTXSTT;               // I2C TX, start condition
  51.   UCB0TXBUF = 0x010;                        // Write DAC control byte
  52.   __bis_SR_register(CPUOFF + GIE);          // Enter LPM0 w/ interrupts
  53. }

  54. // USCI_B0 Data ISR
  55. #pragma vector = USCIAB0TX_VECTOR
  56. __interrupt void USCIAB0TX_ISR(void)
  57. {
  58.   static unsigned char ByteCtr;

  59.   UCB0TXBUF = Sine_Tab[ByteCtr++];          // Transmit data byte
  60.   ByteCtr &= 0x1f;                          // Do not exceed table
  61. }
复制代码

点评

您好,请问这个代码范例是哪儿找的?官方出的吗?  详情 回复 发表于 2014-10-28 19:39

赞赏

1

查看全部赞赏

 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

10
 
参考下范例

点评

非常感谢!!  详情 回复 发表于 2013-6-7 17:16
 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

11
 
你可以直接往里面写试试,并且延时这么多也没有必要。
波特率也需要注意下,你是做的10分频
 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

12
 

回复 10楼 wstt 的帖子

非常感谢!!
 
 
 

回复

7

帖子

1

TA的资源

一粒金砂(初级)

13
 

您好,请问这个代码范例是哪儿找的?官方出的吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表