MSP5438A 的I2C模块不知道对不对,求大神指点
新人第一次发帖,目前在做小车直立,看到的陀螺仪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;
uchar RxBuf={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 ; 0RECEIVE
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
----------------------------------------------------------------------------*/
void I2C_Txbyte(uchar Reg_addr,uchar Reg_data)
{
while(UCB0STAT & UCBBUSY);
I2C_WriteMode();
TxData=Reg_addr;
TxData=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=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; // 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=UCB0RXBUF;
UCB0CTL1 &=~UCTXNACK;
}
else
{
//UCB0CTL1 |= UCTXSTP;
UCB0IFG &=~UCRXIFG;
__bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
}
}
} 本帖最后由 黑巧克力 于 2014-9-11 10:24 编辑
沙发自己拿,好像字体大小设置的不太好。重新发一下 #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;
uchar RxBuf={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 ; 0RECEIVE
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
----------------------------------------------------------------------------*/
void I2C_Txbyte(uchar Reg_addr,uchar Reg_data)
{
while(UCB0STAT & UCBBUSY);
I2C_WriteMode();
TxData=Reg_addr;
TxData=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=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; // 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=UCB0RXBUF;
UCB0CTL1 &=~UCTXNACK;
}
else
{
//UCB0CTL1 |= UCTXSTP;
UCB0IFG &=~UCRXIFG;
__bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
}
}
}
发代码最好选择 发帖或者 回帖中的 代码模式,见图
本帖最后由 lingergz 于 2014-10-15 11:47 编辑
这个芯片我没用过,但是我目前在用的一个 是MSP430G2533的IIC 通信,与显示屏通信的,目前没发下问题。如果楼主要的话,我可以发上来 lingergz 发表于 2014-10-15 11:43
发代码最好选择 发帖或者 回帖中的 代码模式,见图
哦哦 论坛小白见笑了 lingergz 发表于 2014-10-15 11:46
这个芯片我没用过,但是我目前在用的一个 是MSP430G2533的IIC 通信,与显示屏通信的,目前没发下问题。如果 ...
真的可以吗?? 先在这里谢谢了
页:
[1]