您好,使用MSP430G2553驱动DRV2604L,I2C无法通讯,I2C初始化及寄存器配置如下:
/*************************************************
函数名称:DRV2604L_Init(void)
功 能:DRV2604L初始化
参 数:无
返回值 :无
**************************************************/
void Init_DRV2604L(void)
{
P2OUT |= 0x20;
I2C_Init();
DRV2604L_Write_ModeSel();
DRV2604L_Write_LRASel();
DRV2604L_Write_LRAOpenLoop();
DRV2604L_Write_LRAPeriod();
P2OUT &= ~0x20; //5V Unenable
}
/*************************************************
函数名称:I2C_Init(void)
功 能:I2C初始化
参 数:无
返回值 :无
**************************************************/
void I2C_Init(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗定时器
P1SEL |= (BIT6 + BIT7); // P1.6 = SCL, P1.7=SDA
P1SEL2 |= (BIT6 + BIT7); // P1.6 = SCL, P1.7=SDA
UCB0CTL1 |= UCSWRST; //复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; //主模式+IIC模式+同步模式
UCB0CTL1 |= UCSSEL_2 + UCSWRST; //SMCLK+复位
UCB0BR0 = 10; //时钟分频设置(UCBxBR0 + UCBxBR1 × 256)
UCB0BR1 = 0; //1MHZ/10=100KHZ
UCB0I2CSA = 0x5A; //7位地址
UCB0CTL1 &= ~UCSWRST; //清复位标志
delay_us(1);
}
/*************************************************
函数名称:DRV2604L_Write_ModeSel(void)
功 能:PWM模式选择
参 数:无
返回值 :无
**************************************************/
void DRV2604L_Write_ModeSel(void)
{
I2C_Init();
while(UCB0CTL1 & UCTXSTP); //If ICC Stop
UCB0CTL1 |= UCTR;
UCB0CTL1 |= UCTXSTT; //IIC Start + Write
while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
UCB0TXBUF = 0xB4; //ADDRESS+WRITE
while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
delay_us(1);
UCB0TXBUF = 0x01; //Mode register Address
while(!(IFG2 & UCB0TXIFG)); //一直卡在这一句
delay_us(1);
UCB0TXBUF = 0x03; //PWM Mode
while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
delay_us(1);
UCB0CTL1 |= UCTXSTP + UCTXNACK; //IIC Stop + NACK
while((UCB0CTL1 & UCTXSTP) == 1);
}
while(!(IFG2 & UCB0TXIFG));将这一句屏蔽后,用示波器观察SCL及SDA输出波形是正确的,基本可以确定从机无响应,请问是DRV2604的从机地址问题还是,通讯格式有问题?