430单片机自带的IIC模块

2019-03-24 12:25发布

我想学学430单片机自带的IIC模块使用,现在编了段小程序,可是运行不正确,程序如下,问题在最后面。
  //初始化IIC模块
  UCB0CTL1 |= UCSWRST;
  UCB0CTL0 |=UCMST+UCMODE1+UCMODE0+UCSYNC; // I2C Master, synchronous mode
  UCB0CTL1 = UCMODE1+UCMODE0+UCSWRST;       // Use SMCLK, keep software reset
  P3SEL |=0x06;     //p3.1为UCB0SDA,P3.2为UCB0SCL
  UCB0CTL1 = UCSSEL_3+UCSWRST;              // Use SMCLK, keep SW reset
  UCB0BR0 =10;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0CTL1 &= ~UCSWRST;   // Clear software reset, resume operation
  //写函数  
  UCB0CTL0 |=UCMST+UCMODE_3+UCSYNC; // I2C Master, synchronous mode
  //UCB0CTL1 = UCMODE1+UCMODE0+UCSWRST;       // Use SMCLK, keep software reset
  UCB0I2CSA = 0x3a; //这个地址是真实地址后面加读/写位组成
  UCB0CTL0 &=~UCSLA10;  //从机地址为7位
  UCB0CTL1 |= UCTR;//transmitter mode 发送模式  
  UCB0CTL1 |= UCTXSTT; //start condition,
  while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,为空则UCB0TXIFG为1.
  for(i=0;i<1;i++)
  {
    UCB0TXBUF = 0x0d;//IIC设备中寄存器的地址
    while((UCB0CTL1 & UCTXSTT) == UCTXSTT);//检测从机ACK信号,有ACK信号,则UCTXSTT自动清零//以上顺序不能改变
    while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,
  }
  UCB0CTL1 |= UCTXSTP;//发送STOP信号

我的问题是 :
1. UCB0CTL1 |= UCTXSTT; 也就是发送START后示波器上显示的IIC从设备的地址信息不对;
2. UCB0TXBUF = 0x0d,运行后,示波器没反应更谈不上有ACK信号,可是却通过了while((UCB0CTL1 & UCTXSTT) == UCTXSTT判断是否有确认信号的这句话;
3. 程序停在了倒数第二句话while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,既然已经把数据0x0d送到发送缓冲中去,就应该有输出,而且UCB0TXBUF为空才对啊?

向大家请教了!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
wqy
1楼-- · 2019-03-24 20:23
 精彩回答 2  元偷偷看……
wstt
2楼-- · 2019-03-25 01:20
< :TI_MSP430_内容页_SA7 --> 根据手册的描述:
The address is right-justified. In 7-bit slave addressing mode, bit 6 is the MSB, and bits 9-7 are ignored.

[ 本帖最后由 wstt 于 2013-3-21 13:19 编辑 ]
wstt
3楼-- · 2019-03-25 05:24
1.jpg
据此:
数据为0111010 (RW)
wqy
4楼-- · 2019-03-25 09:45
 精彩回答 2  元偷偷看……
wstt
5楼-- · 2019-03-25 10:37
  1. //******************************************************************************
  2. //  MSP430G2xx3 Demo - USCI_B0 I2C Master Interface to DAC8571, Write
  3. //
  4. //  Description: Using UCB0TXIE, a continuous sine wave is output to the
  5. //  external DAC using a 16-point look-up table. Only one start condition
  6. //  is executed. Data is handled by the ISR and the CPU is normally in LPM0.
  7. //  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.2MHz
  8. //
  9. //               MSP430G2xx3                       DAC8571
  10. //           ------------------                   ------------
  11. //         -|XIN   P1.7/UCB0SDA|<--------------->|SDA         |
  12. //          |      P1.6/UCB0SCL|---------------->|SCL  I2C    |
  13. //         -|XOUT              |                 |    SLAVE   |
  14. //          |     I2C MASTER   |              GND|A0          |
  15. //
  16. //
  17. //  DAC8571 I2C address = 0x4C (A0 = GND)
  18. //
  19. //  D. Dang
  20. //  Texas Instruments Inc.
  21. //  February 2011
  22. //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
  23. //******************************************************************************
  24. #include "msp430g2553.h"

  25. const unsigned char Sine_Tab[] =            // 16 Point 16-bit Sine Table
  26. {
  27.   0xFF,                                     // MSB Word 0
  28.   0xFF,                                     // LSB
  29.   0xF6,                                     // MSB Word 1
  30.   0x40,                                     // LSB
  31.   0xDA,                                     // MSB Word 2
  32.   0x81,                                     // LSB
  33.   0xB0,                                     // MSB Word 3
  34.   0xFA,                                     // LSB
  35.   0x7F,                                     // MSB Word 4
  36.   0xFF,                                     // LSB
  37.   0x4F,                                     // MSB Word 5
  38.   0x03,                                     // LSB
  39.   0x25,                                     // MSB Word 6
  40.   0x7C,                                     // LSB
  41.   0x09,                                     // MSB Word 7
  42.   0xBD,                                     // LSB
  43.   0x00,                                     // MSB Word 8
  44.   0x00,                                     // LSB
  45.   0x09,                                     // MSB Word 9
  46.   0xBD,                                     // LSB
  47.   0x25,                                     // MSB Word 10
  48.   0x7C,                                     // LSB
  49.   0x4F,                                     // MSB Word 11
  50.   0x03,                                     // LSB
  51.   0x7F,                                     // MSB Word 12
  52.   0xFE,                                     // LSB
  53.   0xB0,                                     // MSB Word 13
  54.   0xFA,                                     // LSB
  55.   0xDA,                                     // MSB Word 14
  56.   0x81,                                     // LSB
  57.   0xF6,                                     // MSB Word 15
  58.   0x40                                      // LSB
  59. };

  60. void main(void)
  61. {
  62.   WDTCTL = WDTPW + WDTHOLD;                 // Stop Watchdog Timer
  63.   P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  64.   P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  65.   UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  66.   UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  67.   UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  68.   UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  69.   UCB0BR1 = 0;
  70.   UCB0I2CSA = 0x4c;                         // Set slave address
  71.   UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  72.   IE2 |= UCB0TXIE;                          // Enable TX ready interrupt
  73.   UCB0CTL1 |= UCTR + UCTXSTT;               // I2C TX, start condition
  74.   UCB0TXBUF = 0x010;                        // Write DAC control byte
  75.   __bis_SR_register(CPUOFF + GIE);          // Enter LPM0 w/ interrupts
  76. }

  77. // USCI_B0 Data ISR
  78. #pragma vector = USCIAB0TX_VECTOR
  79. __interrupt void USCIAB0TX_ISR(void)
  80. {
  81.   static unsigned char ByteCtr;

  82.   UCB0TXBUF = Sine_Tab[ByteCtr++];          // Transmit data byte
  83.   ByteCtr &= 0x1f;                          // Do not exceed table
  84. }
复制代码“把IIC从设备的sub-address送人UCB0TXBUF之后”,看到这句话,我猜测可能操作流程上有些小问题。
观察上面这段示例代码,其实写从地址的操作不需要你发到TXBUF中,这个过程会由MSP430自动完成。
wqy
6楼-- · 2019-03-25 12:45
我用没有意义的数据当地址试了试,结果示波器上显示的除了要输出的没有意义的数据外后面都跟着01。即使我发真实的IIC从设备的地址一样在后面跟个01,也就是说发正确的地址也没有获得IIC从设备的确认信号。
还有,实在是不好意思,我没有太看懂您给我粘贴的程序哪里是发送从地址的语句,麻烦您给我简单解释一下行吗?急死了。
我觉得我表述的不对,现在更正一下:
我所说的IIC从设备的地址是address;我所说的从地址是IIC从设备内部的寄存器的地址sub-address
我先把IIC从设备地址给了UCB0I2CSA = 0x1d;
在我想配置IIC从设备内部寄存器的时候就把寄存器地址给了缓冲区UCB0TXBUF = CTRL_REG3;(#define CTRL_REG3       0x23)

拜谢了!

[ 本帖最后由 wqy 于 2013-3-21 22:04 编辑 ]

一周热门 更多>

相关问题

    相关文章