我已经下载了一个用于 MSP430F4152控制器 i2c 通信的演示代码
我有32.768kHz 外部晶振、而4.7K 上拉电阻器连接到 SDA 和 SCL 线路
我检查了引脚1和2上的信号、但在 SCL 和 SDA 上没有显示任何脉冲
请检查代码
内部 TXByteCtr;
unsigned char PRxData;
INT Rx = 0;
CHAR WHO _AM_I = 0x00;
unsigned char itgAddress = 0xA0;
void init_I2C (void);
void transmit (void);
接收无效(无效);
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
P6SEL |= BIT1+BIT2;//将 I2C 引脚分配给 USCI_B0
//P1SEL |= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
//P1SEL2|= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
init_i2C();
while (1)
{
//传输过程
RX = 0;
TXByteCtr = 1;
Transmit ();
//接收过程
RX = 1;
receive();
}
}
///----------------------------------
// USCI_B0数据 ISR 用于移动从 I2C 从设备接收到的数据
//到 MSP430内存。 它的结构使其可用于接收
///----------------------------------
#pragma vector = USCIAB0TX_vector
_interrupt void USCIAB0TX_ISR (void)
{
if (Rx = 1)
{//主接收?
PRxData = UCB0RXBUF;//获取 RX 数据
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
}
其他
{//主机发送
if (TXByteCtr)//检查 TX 字节计数器
{
UCB0TXBUF =世卫组织_AM_I;//加载 TX 缓冲器
TXByteCtr -;//减量 TX 字节计数器
}
其他
{
UCB0CTL1 |= UCTXSTP;// I2C 停止条件
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
}
}
}
void init_I2C (void){
UCB0CTL1 |= UCSWRST;//启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
UCB0BR0 = 1;// fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = itgAddress;//从器件地址为069h
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
IE2 |= UCB0RXIE + UCB0TXIE;//启用 RX 和 TX 中断
}
void transmit (void){
while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
_bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断
}
void receive (void){
while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTL1 &=~UCTR;//清除 UCTR
UCB0CTL1 |= UCTXSTT;// I2C 启动条件
while (UCB0CTL1 & UCTXSTT);//起始条件是否发送?
UCB0CTL1 |= UCTXSTP;// I2C 停止条件
_bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断
}
请指导我们完成研发工作、并进一步投入生产
此致、
Anushka