TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430 I2C作为master,读取从设备寄存器后如何发送NACK信号

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;这句话不起作用,不设置也是一样的情况。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430 I2C作为master,读取从设备寄存器后如何发送NACK信号
分享到: 更多 (0)