搜索
bottom↓
回复: 6

MSP5438A 的I2C模块不知道对不对,求大神指点

[复制链接]

出0入0汤圆

发表于 2014-9-11 10:21:24 | 显示全部楼层 |阅读模式
        新人第一次发帖,目前在做小车直立,看到的陀螺仪MPU-6050的测试程序是51模拟的I2C,然后想着是否可以用msp430f5438A 来做。
        但是网上的资料比较少,找了半天,只找到类似的一个帖子  求msp430g2553的SPI和I2C的硬件模块代码  在后面的评论区里看到leisure1688 的回复,然后试着根据msp430f5438A 的寄存器改程序。
        写的不好,献丑了,希望高手帮我看看有什么问题吗?

#include "msp430x54x.h"
#include  "math.h"                                             
#include  "stdio.h"
#define uint unsigned int
#define uchar unsigned char
#define SlaveAddress 0xD0                      //mpu-6050的从地址

void Init_I2C(void);
void I2C_WriteMode(void);
void I2C_ReadMode(void);
void I2C_Txbyte(uchar Reg_addr,uchar Reg_data);
uchar I2C_Rxbyte(uchar Reg_addr);


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

void Init_I2C(void)
{
  WDTCTL=WDTPW+WDTHOLD;
  P3SEL|=0x06;
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;

  UCB0I2CSA = SlaveAddress;
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
}

void I2C_WriteMode(void)
{
  UCB0CTL1 |= UCTR;                              //UCTR=1 TRANSMIT ; 0  RECEIVE
  UCB0IFG &=~ UCTXIFG;
  UCB0IE &=~ UCRXIE;
  UCB0IE |= UCTXIE;
}
void I2C_ReadMode(void)
{
UCB0CTL1 &=~ UCTR;
UCB0IFG &=~ UCTXIFG;
UCB0IE &=~ UCTXIE;
UCB0IE |= UCRXIE;                                // 关闭发送中断,开启接收中断
}
/*----------------------------------------------------------------------------
功能:向I2C接口发送1个字节数据
输入:待发送字节个数 num,7-bit从机地址slave_addr
输出:
说明:在发送第1个字节过程中需要置位停止位,待发送数据放在TxData[0]
----------------------------------------------------------------------------*/
void I2C_Txbyte(uchar Reg_addr,uchar Reg_data)
{
    while(UCB0STAT & UCBBUSY);
    I2C_WriteMode();
    TxData[1]=Reg_addr;
    TxData[0]=Reg_data;
    TXByteCtr=2;                                     // Load TX byte counter
    UCB0CTL1 |= UCTXSTT;                 // I2C TX, start condition
    //while (UCB0CTL1 & UCTXSTT);
    __bis_SR_register(LPM0_bits + GIE);                   // Enter LPM0 w/ interrupts
    while (UCB0CTL1 & UCTXSTP);
}

uchar I2C_Rxbyte(uchar Reg_addr)
{
    while(UCB0STAT & UCBBUSY);
    I2C_WriteMode();
    TxData[0]=Reg_addr;
    TXByteCtr=1;                                    // Load TX byte counter
    UCB0CTL1 |= UCTXSTT;                 // I2C TX, start condition
    __bis_SR_register(LPM0_bits + GIE);                   // Enter LPM0 w/ interrupts
    while (UCB0CTL1 & UCTXSTP);
    I2C_ReadMode();
    RXByteCtr=1;
    UCB0CTL1 |= UCTXSTT;
    __bis_SR_register(LPM0_bits + GIE);
    while (UCB0IFG & UCRXIFG);
    while (UCB0CTL1 & UCTXSTP);
    return *RxBuf;                                   //这里返回的值是八进制 还是十进制?
}



#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  if ( UCB0IFG & UCTXIFG )                            //transmit
  {
      if (TXByteCtr)                            // Check TX byte counter
      {
        TXByteCtr--;
        UCB0TXBUF =TxData[TXByteCtr];                 // Load TX buffer                               // Decrement TX byte counter
      }
      else
      {
        UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
        UCB0IFG &=~UCTXIFG;                     // Clear USCI_B0 TX int flag
        //IE2 &=~UCB0TXIE;
        __bic_SR_register_on_exit(LPM0_bits);      // Exit LPM0
      }
  }
  if ( UCB0IFG & UCRXIFG )                            //receive
    {
      if (RXByteCtr)
      {
          RXByteCtr--;
          if(RXByteCtr==0)
          {
            UCB0CTL1 |= UCTXSTP+UCTXNACK;       //必须在接受最后一个数据之前发送停止和NACK
          }
          RxBuf[RXByteCtr]=UCB0RXBUF;
          UCB0CTL1 &=~UCTXNACK;
      }
      else
      {
          //UCB0CTL1 |= UCTXSTP;
          UCB0IFG &=~UCRXIFG;
          __bic_SR_register_on_exit(LPM0_bits);      // Exit LPM0
      }
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-9-11 10:22:37 | 显示全部楼层
本帖最后由 黑巧克力 于 2014-9-11 10:24 编辑

沙发自己拿,好像字体大小设置的不太好。重新发一下

出0入0汤圆

 楼主| 发表于 2014-9-11 10:23:22 | 显示全部楼层
#include "msp430x54x.h"
#include  "math.h"                                             
#include  "stdio.h"
#define uint unsigned int
#define uchar unsigned char
#define SlaveAddress 0xD0                      //mpu-6050的从地址

void Init_I2C(void);
void I2C_WriteMode(void);
void I2C_ReadMode(void);
void I2C_Txbyte(uchar Reg_addr,uchar Reg_data);
uchar I2C_Rxbyte(uchar Reg_addr);


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

void Init_I2C(void)
{
  WDTCTL=WDTPW+WDTHOLD;
  P3SEL|=0x06;
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;

  UCB0I2CSA = SlaveAddress;
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
}

void I2C_WriteMode(void)
{
  UCB0CTL1 |= UCTR;                              //UCTR=1 TRANSMIT ; 0  RECEIVE
  UCB0IFG &=~ UCTXIFG;
  UCB0IE &=~ UCRXIE;
  UCB0IE |= UCTXIE;
}
void I2C_ReadMode(void)
{
UCB0CTL1 &=~ UCTR;
UCB0IFG &=~ UCTXIFG;
UCB0IE &=~ UCTXIE;
UCB0IE |= UCRXIE;                                // 关闭发送中断,开启接收中断
}
/*----------------------------------------------------------------------------
功能:向I2C接口发送1个字节数据
输入:待发送字节个数 num,7-bit从机地址slave_addr
输出:
说明:在发送第1个字节过程中需要置位停止位,待发送数据放在TxData[0]
----------------------------------------------------------------------------*/
void I2C_Txbyte(uchar Reg_addr,uchar Reg_data)
{
    while(UCB0STAT & UCBBUSY);
    I2C_WriteMode();
    TxData[1]=Reg_addr;
    TxData[0]=Reg_data;
    TXByteCtr=2;                                     // Load TX byte counter
    UCB0CTL1 |= UCTXSTT;                 // I2C TX, start condition
    //while (UCB0CTL1 & UCTXSTT);
    __bis_SR_register(LPM0_bits + GIE);                   // Enter LPM0 w/ interrupts
    while (UCB0CTL1 & UCTXSTP);
}

uchar I2C_Rxbyte(uchar Reg_addr)
{
    while(UCB0STAT & UCBBUSY);
    I2C_WriteMode();
    TxData[0]=Reg_addr;
    TXByteCtr=1;                                    // Load TX byte counter
    UCB0CTL1 |= UCTXSTT;                 // I2C TX, start condition
    __bis_SR_register(LPM0_bits + GIE);                   // Enter LPM0 w/ interrupts
    while (UCB0CTL1 & UCTXSTP);
    I2C_ReadMode();
    RXByteCtr=1;
    UCB0CTL1 |= UCTXSTT;
    __bis_SR_register(LPM0_bits + GIE);
    while (UCB0IFG & UCRXIFG);
    while (UCB0CTL1 & UCTXSTP);
    return *RxBuf;                                   //这里返回的值是八进制 还是十进制?
}



#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  if ( UCB0IFG & UCTXIFG )                            //transmit
  {
      if (TXByteCtr)                            // Check TX byte counter
      {
        TXByteCtr--;
        UCB0TXBUF =TxData[TXByteCtr];                 // Load TX buffer                               // Decrement TX byte counter
      }
      else
      {
        UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
        UCB0IFG &=~UCTXIFG;                     // Clear USCI_B0 TX int flag
        //IE2 &=~UCB0TXIE;
        __bic_SR_register_on_exit(LPM0_bits);      // Exit LPM0
      }
  }
  if ( UCB0IFG & UCRXIFG )                            //receive
    {
      if (RXByteCtr)
      {
          RXByteCtr--;
          if(RXByteCtr==0)
          {
            UCB0CTL1 |= UCTXSTP+UCTXNACK;       //必须在接受最后一个数据之前发送停止和NACK
          }
          RxBuf[RXByteCtr]=UCB0RXBUF;
          UCB0CTL1 &=~UCTXNACK;
      }
      else
      {
          //UCB0CTL1 |= UCTXSTP;
          UCB0IFG &=~UCRXIFG;
          __bic_SR_register_on_exit(LPM0_bits);      // Exit LPM0
      }
    }
}

出0入0汤圆

发表于 2014-10-15 11:43:25 | 显示全部楼层


发代码最好选择 发帖或者 回帖中的 代码模式,见图


本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-10-15 11:46:42 | 显示全部楼层
本帖最后由 lingergz 于 2014-10-15 11:47 编辑

这个芯片我没用过,但是我目前在用的一个 是MSP430G2533的IIC 通信,与显示屏通信的,目前没发下问题。如果楼主要的话,我可以发上来

出0入0汤圆

 楼主| 发表于 2014-10-18 22:21:08 | 显示全部楼层
lingergz 发表于 2014-10-15 11:43
发代码最好选择 发帖或者 回帖中的 代码模式,见图

哦哦 论坛小白见笑了

出0入0汤圆

 楼主| 发表于 2014-10-18 22:22:03 | 显示全部楼层
lingergz 发表于 2014-10-15 11:46
这个芯片我没用过,但是我目前在用的一个 是MSP430G2533的IIC 通信,与显示屏通信的,目前没发下问题。如果 ...

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

本版积分规则

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

GMT+8, 2024-4-27 13:10

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

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