搜索
bottom↓
回复: 5

G2553 硬件I2C接口一直卡在从机应答

[复制链接]

出0入0汤圆

发表于 2014-8-21 21:47:52 | 显示全部楼层 |阅读模式
基本上是照着官方例程写的,驱动AD5933,器件地址是0X0D,电路焊接好之后调程序(单步调试),
卡在while (UCB0CTL1 & UCTXSTT);这句话,查看寄存器,发现UCTXSTT一直为1,并没有接收到从机应答
请问各位前辈怎么调试出来I2C的,有什么要注意的事项呢?

出0入0汤圆

 楼主| 发表于 2014-8-21 21:49:18 | 显示全部楼层
  1. #include "i2c.h"

  2. uchar TXByteCtr,RXByteCtr;
  3. uchar TxData[2];
  4. uchar RxBuf[6]={0x00};

  5. void Init_I2C(void)
  6. {
  7.   UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  8.   UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  9.   UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  10.   UCB0BR0 = 12;                             // fSCL = SMCLK/160 = ~100kHz
  11.   UCB0BR1 = 0;
  12.   P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  13.   P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  14.   UCB0I2CSA = SlaveAddress;
  15.   UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  16. }

  17. void I2C_WriteMode(void)
  18. {
  19. UCB0CTL1 |= UCTR;
  20. IFG2 &=~ UCB0TXIFG;
  21. IE2 &=~ UCB0RXIE;
  22. IE2 |= UCB0TXIE;
  23. }
  24. void I2C_ReadMode(void)
  25. {
  26. UCB0CTL1 &=~ UCTR;
  27. IFG2 &=~ UCB0RXIFG;
  28. IE2 &=~ UCB0TXIE;
  29. IE2 |= UCB0RXIE;                                // 关闭发送中断,开启接收中断
  30. }
  31. /*----------------------------------------------------------------------------
  32. 功能:向I2C接口发送1个字节数据
  33. 输入:待发送字节个数 num,7-bit从机地址slave_addr
  34. 输出:
  35. 说明:在发送第1个字节过程中需要置位停止位,待发送数据放在TxData[0]
  36. ----------------------------------------------------------------------------*/
  37. void I2C_Txbyte(uchar Reg_addr,uchar Reg_data)
  38. {
  39.   while(UCB0STAT & UCBBUSY);
  40.   I2C_WriteMode();
  41.   TxData[1]=Reg_addr;
  42.   TxData[0]=Reg_data;
  43.   TXByteCtr=2;                                     // Load TX byte counter
  44.   UCB0CTL1 |= UCTXSTT;                 // I2C TX, start condition
  45.   while (UCB0CTL1 & UCTXSTT);
  46.   __bis_SR_register(CPUOFF + GIE);                   // Enter LPM0 w/ interrupts
  47.   while (UCB0CTL1 & UCTXSTP);
  48. }

  49. void I2C_Rxbyte(uchar Reg_addr)
  50. {
  51. while(UCB0STAT & UCBBUSY);
  52. I2C_WriteMode();
  53. TxData[0]=Reg_addr;
  54. TXByteCtr=1;                                    // Load TX byte counter
  55. UCB0CTL1 |= UCTXSTT;                 // I2C TX, start condition
  56. __bis_SR_register(CPUOFF + GIE);                   // Enter LPM0 w/ interrupts
  57. while (UCB0CTL1 & UCTXSTP);
  58. I2C_ReadMode();
  59. RXByteCtr=1;
  60. UCB0CTL1 |= UCTXSTT;
  61. __bis_SR_register(CPUOFF + GIE);
  62. while (IFG2 & UCB0RXIFG);
  63. while (UCB0CTL1 & UCTXSTP);
  64. }



  65. #pragma vector = USCIAB0TX_VECTOR
  66. __interrupt void USCIAB0TX_ISR(void)
  67. {
  68.   if ( IFG2 & UCB0TXIFG )
  69.   {
  70.        if (TXByteCtr)                            // Check TX byte counter
  71.        {
  72.         TXByteCtr--;
  73.         UCB0TXBUF =TxData[TXByteCtr];                 // Load TX buffer                               // Decrement TX byte counter
  74.        }
  75.    else
  76.        {
  77.         UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
  78.         IFG2&=~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
  79.         //IE2 &=~UCB0TXIE;
  80.         __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
  81.        }
  82.   }
  83.   if ( IFG2 & UCB0RXIFG )
  84.     {
  85.      if (RXByteCtr)
  86.      {
  87.       RXByteCtr--;
  88.       if(RXByteCtr==0)
  89.       {
  90.        UCB0CTL1 |= UCTXSTP+UCTXNACK;//必须在接受最后一个数据之前发送停止和NACK
  91.       }
  92.       RxBuf[RXByteCtr]=UCB0RXBUF;
  93.       UCB0CTL1 &=~UCTXNACK;
  94.      }
  95.      else
  96.      {
  97.       //UCB0CTL1 |= UCTXSTP;
  98.       IFG2&=~UCB0RXIFG;
  99.        __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
  100.      }
  101.     }
  102. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-8-22 10:42:42 | 显示全部楼层
硬件上要加上拉电阻了吗?

出0入0汤圆

发表于 2015-3-29 16:59:16 | 显示全部楼层
我用G2553调试BH1750光照强度模块正常通过,感觉要注意的一点是设置地址问题,实际地址会比理论地址右移一位

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-30 15:53:06 | 显示全部楼层
430硬件I2C不是很好用,建议换成IO模拟的I2C。

出0入0汤圆

发表于 2015-3-31 15:39:44 | 显示全部楼层
模拟比较方便,也便于移植,可是试试!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 10:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表