Hi,TI:
MSP430F5438A, 使用硬件I2C通信,读取MAX44009光感值。
MAX44009的光感值高,低位存储在03,04寄存器中,要求读取03寄存器后,发送个NACK信号,再发送个Re start信号,接着读取04寄存器。
要求的读取时序如下:
我的读取代码如下:
float Max44009_Read( void)
{
volatile unsigned char tmp1, tmp2;
unsigned char vIndex = 0; //指数
unsigned char vMantissa = 0; //尾数
int val16 = 0;
float vflux = 0.0;
UCB0I2CSA = MAX44009_ADDRESS; //
UCB0CTL1 |= UCTXNACK; //主机发送应答信号为高电平
while( UCB0CTL1 & UCTXSTP );
UCB0CTL1 |= UCTR; // 写模式
UCB0CTL1 |= UCTXSTT; // 发送启动位
UCB0TXBUF = 0x03; // 发送字节地址,no hold mode
// 等待UCTXIFG=1 与UCTXSTT=0 同时变化 等待一个标志位即可
while(!(UCB0IFG & UCTXIFG))
{
if( UCB0IFG & UCNACKIFG ) // 若无应答 UCNACKIFG=1
{
return 1;
}
}
UCB0CTL1 &= ~UCTR; // 读模式
UCB0CTL1 |= UCTXSTT; // 发送启动位和读控制字节
while( UCB0CTL1&UCTXSTT); // 等待UCTXSTT=0
while(!(UCB0IFG & UCRXIFG)); // 读取字节内容
tmp1 = UCB0RXBUF; // 读取BUF寄存器在发送停止位之后
UCB0CTL1 |= UCTR; // 写模式
UCB0CTL1 |= UCTXSTT; // 发送启动位
UCB0TXBUF = 0x04; // 发送字节地址,no hold mode
// 等待UCTXIFG=1 与UCTXSTT=0 同时变化 等待一个标志位即可
while(!(UCB0IFG & UCTXIFG))
{
if( UCB0IFG & UCNACKIFG ) // 若无应答 UCNACKIFG=1
{
return 1;
}
}
UCB0CTL1 &= ~UCTR; // 读模式
UCB0CTL1 |= UCTXSTT; // 发送启动位和读控制字节
while( UCB0CTL1&UCTXSTT);
UCB0CTL1 |= UCTXSTP;
while(!(UCB0IFG & UCRXIFG)); // 读取字节内容
tmp2 = UCB0RXBUF; // 读取BUF寄存器在发送停止位之后
while(UCB0CTL1 & UCTXSTP); // 等待发送完成
//指数
vIndex = tmp1&0xF0;
vIndex >>= 4;
//尾数
vMantissa = (tmp1&0x0F);
vMantissa <<= 4;
vMantissa |= (tmp2&0x0F);
if (vIndex == 0x01)
{
vIndex = 0x00;
}
else if (vIndex > 0x0E)
{
vIndex = 0x0E;
}
val16 = (0x01<<vIndex);
vflux = ( (float)val16 ) * ( (float)vMantissa) * 0.045;
return vflux;
}
代码中设置了UCB0CTL1 |= UCTXNACK; 希望在读取03寄存器后,msp430会发送个NACK信号。
但是在实际逻辑分析仪抓取的信号波形图中,msp430获取03寄存器的值后,会发一个ACK信号,接着又发送读出03寄存器的命令,再次获取03寄存器的值后,才会发送一个NACK 信号。(逻辑分析仪抓取的图,稍后会贴上)
请问,如何让MSP430 读取一个从设备寄存器的值后,直接发送NACK信号?
user5273112:
代码对应的I2C波形图:
gaoyang9992006:
试试不设置那一句有什么效果。
user5273112:
回复 gaoyang9992006:
UCB0CTL1 |= UCTXNACK;这句话不起作用,不设置也是一样的情况。