This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

f5xx代码移植到G2553

Other Parts Discussed in Thread: MSP430G2553

我现在用的invensense的传感器芯片MPU6050,内部有内置处理器dmp,可以帮助我处理数据.但是,官方给的库是以F5XX为例来写的。我如果想在G2553上使用,需要移植。修改一下底层的驱动,比如时钟和I2C。请问我是用模拟的I2C比较好,还是在F5XX的硬件I2C基础上改?

还有,举个例子

int msp430_clock_enable(void)
{
if (clock.enabled)
return 0;

/* Set ACLK to use REF0CLK.
* Set SMCLK to use the DCO.
*/
UCSCTL4 &= ~SELA_7;
UCSCTL4 |= SELA_2;

UCSCTL8 |= SMCLKREQEN | MCLKREQEN | ACLKREQEN;

/* Enable interrupt for TBCCR0. */
TBCCTL0 = CCIE;

/* Number of ticks per millisecond. */
clock.aclk = 32768;
clock.ticks_per_interrupt = clock.aclk / 1000;
TBCCR0 = clock.ticks_per_interrupt;

/* Use ACLK, set timer to up-count mode, and start timer at zero. */
TBCTL = TBSSEL_1 | MC_2 | TBCLR;

clock.ms_per_interrupt = 1;
clock.timer_remaining_ms += (clock.timer_remaining_ms %
clock.ms_per_interrupt);
clock.enabled = 1;

/* Enable interrupts. */
__bis_SR_register(GIE);

return 0;

}

这个函数中

UCSCTL4 &= ~SELA_7;   UCSCTL4 |= SELA_2;

这些都是G2553中没有的控制位,我该如何修改呢?

万分感谢

  • 请参考MSP430ware中G2553的例程。没有必要移植。

  • 刚好最近做一个项目,用到G2系列的从I2C,为了调试,我编了一个主I2C的代码。你可以参考这个来做。

     

    #include "msp430g2553.h" #include "i2c_master.h" //============================================================================= //============================================================================= // I2C模块发送数据缓存 unsigned char g_I2cTxBuf[I2C_TXBUF_MAX_SIZE] = {0x3B,0x02,0xE8,0x03,0x28,0x64,0x9b};

    // I2C模块接收数据缓存 //static unsigned char g_I2cRxBuf[I2C_RXBUF_MAX_SIZE] = {0,0,0,0,0,0,0,0,};

    void ChangDuty(unsigned short int val) {       g_I2cTxBuf[2] = val&0xFF;       g_I2cTxBuf[3] = (val>>8)&0xFF;       g_I2cTxBuf[4] = 0x3B+0x02+ g_I2cTxBuf[2] +g_I2cTxBuf[3];

    } /******************************************************************************* ** Function : InitMstI2c                                                      ** ** Parameter:                                                                 ** ** Output   :                                                                 ** ** Retutn   :                                                                 ** ================================================================================ ** Author   :                                                                 ** ** Date     :                                                                 ** *******************************************************************************/ void InitMstI2c(unsigned char DevAddr) {     /*g_stI2cMachine.TxCnt = 0;     g_stI2cMachine.RxCnt = 0;     g_stI2cMachine.pTxBuf = g_I2cTxBuf;     g_stI2cMachine.pRxBuf = g_I2cRxBuf;   */     P1SEL |= BIT6 + BIT7;                     // 分配P1.6 P1.7工作在USCI_B0的SDA和SCL模式     P1SEL2|= BIT6 + BIT7;                     //         UCB0CTL1 |= UCSWRST;                      // 配置I2C模块之前需要复位UCB0模块     UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // 配置成7位主I2C模式,同步模式     UCB0CTL1 = UCSSEL_2 + UCSWRST;            // 选择SMCLK时钟源     UCB0BR0 = 5;                             // 设置I2C波特率fSCL = SMCLK/10 = 100kHz     UCB0BR1 = 0;         UCB0I2CSA = DevAddr;                      // 设置默认的I2C从地址     UCB0CTL1 &= ~UCSWRST;                     // 清除复位标志位,恢复到运行模式 }

    /******************************************************************************* ** Function : I2cMSendOneByte                                                 ** ** Parameter:                                                                 ** ** Output   :                                                                 ** ** Retutn   :                                                                 ** ================================================================================ ** Author   :                                                                 ** ** Date     :                                                                 ** *******************************************************************************/ signed short int I2cMSendOneByte(unsigned char Addr, unsigned char Val) {       unsigned short int TimeOut = 0;       if (UCB0STAT & UCBBUSY)       {           return I2C_ERRO_BUSY;       }            TimeOut = I2C_TIME_OUT;       while ((UCB0CTL1 & UCTXSTP) && (TimeOut--)); // 确保STOP       if (!TimeOut)       {           return I2C_ERRO_TIMEOUT1;       }       P1OUT |= BIT4;       P1OUT &= ~BIT4;             // 设置I2C从设备地址,       UCB0I2CSA = Addr;                       UCB0CTL1 |= UCTR + UCTXSTT;         // I2C模块为发送模式,启动START信号       TimeOut = I2C_TIME_OUT;       while ((!(IFG2 & UCB0TXIFG)) && (TimeOut--));       if (!TimeOut)       {           return I2C_ERRO_TIMEOUT2;       }       P1OUT |= BIT4;       P1OUT &= ~BIT4;       UCB0TXBUF = Val;                                   TimeOut = I2C_TIME_OUT;       while ((!(IFG2 & UCB0TXIFG)) && (TimeOut--));       if (!TimeOut)       {           return I2C_ERRO_TIMEOUT4;       }       P1OUT |= BIT4;       P1OUT &= ~BIT4;             // 清除I2C发送缓冲空的中断标志,发送 I2C STOP 信号       IFG2 &= ~UCB0TXIFG;       UCB0CTL1 |= UCTXSTP;             // 发送I2C STOP 信号       TimeOut = I2C_TIME_OUT;       while ((UCB0CTL1 & UCTXSTP) && (TimeOut--)); // 确保STOP       if (!TimeOut)       {           return I2C_ERRO_TIMEOUT5;       }       P1OUT |= BIT4;       P1OUT &= ~BIT4;             return I2C_SUCCESSFUL; }

    /******************************************************************************* ** Function : I2cMSendBytes                                                   ** ** Parameter:                                                                 ** ** Output   :                                                                 ** ** Retutn   :                                                                 ** ================================================================================ ** Author   :                                                                 ** ** Date     :                                                                 ** *******************************************************************************/ signed short int I2cMSendBytes(unsigned char DevAddr, unsigned char *Data, unsigned char Numb) {       unsigned short int TimeOut = 0;       unsigned char i = 0;             if (UCB0STAT & UCBBUSY)       {           return I2C_ERRO_BUSY;       }            TimeOut = I2C_TIME_OUT;       while ((UCB0CTL1 & UCTXSTP) && (TimeOut--)); // 确保STOP       if (!TimeOut)       {           return I2C_ERRO_TIMEOUT1;       }       P1OUT |= BIT4;       P1OUT &= ~BIT4;             // 设置I2C从设备地址,       UCB0I2CSA = DevAddr;                       UCB0CTL1 |= UCTR + UCTXSTT;         // I2C模块为发送模式,启动START信号       TimeOut = I2C_TIME_OUT;       while ((!(IFG2 & UCB0TXIFG)) && (TimeOut--));       if (!TimeOut)       {           return I2C_ERRO_TIMEOUT2;       }       P1OUT |= BIT4;       P1OUT &= ~BIT4;             for (i=0;i<Numb;i++)       {           UCB0TXBUF = Data[i];                           TimeOut = I2C_TIME_OUT;           while ((!(IFG2 & UCB0TXIFG)) && (TimeOut--));           if (!TimeOut)           {               return I2C_ERRO_TIMEOUT4;           }           P1OUT |= BIT4;           P1OUT &= ~BIT4;       }             // 清除I2C发送缓冲空的中断标志,发送 I2C STOP 信号       IFG2 &= ~UCB0TXIFG;       UCB0CTL1 |= UCTXSTP;             // 发送I2C STOP 信号       TimeOut = I2C_TIME_OUT;       while ((UCB0CTL1 & UCTXSTP) && (TimeOut--)); // 确保STOP       if (!TimeOut)       {           return I2C_ERRO_TIMEOUT5;       }       P1OUT |= BIT4;       P1OUT &= ~BIT4;             return I2C_SUCCESSFUL; }

  • Hi, Smith,

    你好!这个问题我记得前面已经回过了。

    从F5XX到G2XX的代码移植,主要注意这几个方面:

    1.SYSTEM CLOCK的设置不一样,X5XX与X2XX的时钟系统区别非常大,这一块基本就是重写,如果需要帮助,可以将你的需求发上来,大家帮你解决。

    2.F5529与G2553里的USCIB模块实现IIC接口时,也有微小区别,主要是寄存器名字有些不一样。

    3.UCSCTL4 &= ~SELA_7;   UCSCTL4 |= SELA_2;是设置ACLK频率为DCO的分频,分频比在USCTL4 FLLD里面设置。

    G2553的时钟系统没有这个寄存器,ACLK不能来自DCO,但当然也不能设置为DCO的分频。

    希望能够帮到你。

    Regards,

    Hardy