i2c通信过程问题

2019-07-15 16:42发布

在发送数据过程中,为什么只发送了几个byte就从ISR中跳出来了?而且在发送数据过程中,STAT寄存器中SCLLOW位始终置位,这是对的吗?我的程序如下所示:
  1. #include "msp430x54xA.h"

  2. unsigned char *PTxData;                     // Pointer to TX data

  3. unsigned char TXByteCtr;

  4. #define VCC3P3_PwrOn         (P8OUT |= BIT5)

  5. #define VCC3P3_PwrGood       (P8IN & BIT6)

  6. #define LED_ON               (P3OUT &= ~(BIT6))

  7. #define LED_OFF              (P3OUT |= BIT6)

  8. const unsigned char TxData[] =              // Table of data to transmit

  9. {

  10. 0x01,

  11. 0x0b,

  12. 0x02,

  13. 0x00,

  14. 0x00,

  15. 0x03,

  16. 0x32,

  17. 0x00,

  18. };

  19. void test_mcu_port_init(void);

  20. void main(void)

  21. {

  22. WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  23. test_mcu_port_init();

  24. VCC3P3_PwrOn;

  25. while(!(VCC3P3_PwrGood))

  26. {

  27. ;

  28. }

  29. LED_ON;

  30. P3SEL |= 0x80;                            // Assign I2C pins to USCI_B0

  31. P5SEL |= 0x10;

  32. UCB1CTL1 |= UCSWRST;                      // Enable SW reset

  33. UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode

  34. UCB1CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset

  35. UCB1BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz

  36. UCB1BR1 = 0;

  37. UCB1I2CSA = 0x4a;                         // Slave Address is 048h

  38. UCB1CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation

  39. UCB1IE |= UCTXIE;                         // Enable TX interrupt

  40. //  while (1)

  41. //  {

  42.    __delay_cycles(50);                     // Delay required between transaction

  43.    PTxData = (unsigned char *)TxData;      // TX array start address

  44.                                            // Place breakpoint here to see each

  45.                                            // transmit operation.

  46.    TXByteCtr = sizeof TxData;              // Load TX byte counter

  47.    UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition

  48.    __bis_SR_register(GIE);     // Enter LPM0, enable interrupts

  49.    __no_operation();                       // Remain in LPM0 until all data

  50.                                            // is TX'd

  51.    while (UCB1CTL1 & UCTXSTP);             // Ensure stop condition got sent

  52. //  }

  53. }

  54. void test_mcu_port_init(void)

  55. {

  56. /*将所有端口恢复到初始值*/

  57. P1OUT &= 0x00;

  58. P2OUT &= 0x00;

  59. P3OUT &= 0x00;

  60. /*LED为关闭状态*/

  61. LED_OFF;

  62. P4OUT &= 0x00;

  63. /*I/O扩展芯片中断管脚拉高*/

  64. P4OUT |= BIT6;

  65. P5OUT &= 0x00;

  66. P6OUT &= 0x00;

  67. P7OUT &= 0x00;

  68. /*关闭1.8V的MOSFET*/

  69. P7OUT |= BIT4;

  70. P8OUT |= 0x00;

  71. /*定义所有端口方向和功能选择*/

  72. P1SEL |= 0x00;

  73. P1DIR |= 0x5b;

  74. P2SEL |= 0x00;

  75. P2DIR |= 0xe7;

  76. P3SEL |= 0xbf;

  77. P3DIR |= 0x40;

  78. P4SEL |= 0x59;

  79. P4DIR |= 0xae;

  80. P5SEL |= 0xd0;

  81. P5DIR |= 0x25;

  82. P6SEL |= 0x03;

  83. P6DIR |= 0x78;

  84. P7SEL |= 0x0b;

  85. P7DIR |= 0xb4;

  86. P8SEL |= 0x00;

  87. P8DIR |= 0x3f;

  88. }

  89. //------------------------------------------------------------------------------

  90. // The USCIAB0TX_ISR is structured such that it can be used to transmit any

  91. // number of bytes by pre-loading TXByteCtr with the byte count. Also, TXData

  92. // points to the next byte to transmit.

  93. //------------------------------------------------------------------------------

  94. #pragma vector = USCI_B1_VECTOR

  95. __interrupt void USCI_B1_ISR(void)

  96. {

  97. switch(__even_in_range(UCB1IV,12))

  98. {

  99. case  0: break;                           // Vector  0: No interrupts

  100. case  2: break;                           // Vector  2: ALIFG

  101. case  4: break;                           // Vector  4: NACKIFG

  102. case  6: break;                           // Vector  6: STTIFG

  103. case  8: break;                           // Vector  8: STPIFG

  104. case 10: break;                           // Vector 10: RXIFG

  105. case 12:                                  // Vector 12: TXIFG

  106.    if (TXByteCtr)                          // Check TX byte counter

  107.    {

  108.      UCB1TXBUF = *PTxData++;               // Load TX buffer

  109.      TXByteCtr--;                          // Decrement TX byte counter

  110.    }

  111.    else

  112.    {

  113.      UCB1CTL1 |= UCTXSTP;                  // I2C stop condition

  114.      UCB1IFG &= ~UCTXIFG;                  // Clear USCI_B0 TX int flag

  115.    }

  116. default: break;

  117. }

  118. }

  119. 请帮忙解答一下
复制代码



请帮忙解答一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
ben111
1楼-- · 2019-07-15 21:01
另外一个问题,当slave收到数据之后,会给master一个ACK,这个ACK是slave自动发的吧?master在检测到

ACK之后,才会继续发送下一个数据吗?
ben111
2楼-- · 2019-07-16 01:19
 精彩回答 2  元偷偷看……

一周热门 更多>