主题中讨论的其他器件: MSP-EXP430F5529LP
工具与软件:
我正在使用 MSP430F5529写入 EEPROM AT24C256。 我修改了"MSP430F55xx_uscib0_i2c_08.c"示例代码。 我一直面临 NAK 错误。 请参考以下代码:
unsigned char * PTxData; //指向 TX 数据
unsigned char TXByteCtr;
const unsigned char TxData[]= //要发送的数据表
{
0x00、
0x00、
0x44
};
int main (void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; //停止 WDT
P3SEL |= 0x03; //将 I2C 引脚分配至 USCI_B0
UCB0CTL1 |= UCSWRST; //启用软件复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位
UCB0BR0= 12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1=0;
UCB0I2CSA = 0x50; //从地址为048h
UCB0CTL1 &=~μ s UCSWRST; //清除软件复位、恢复操作
UCB0IE |= UCTXIE; //启用 TX 中断
while (1)
{
for (i=0;i<10;i++); //事务之间需要延迟
PTxData =(unsigned char *) TxData; // TX 阵列起始地址
//在此处放置断点以查看每个断点
//发送操作。
TXByteCtr = TxData 的大小; //加载 TX 字节计数器
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件
__bis_SR_register (LPM0_bits + GIE); //进入 LPM0、启用中断
___ no_operation(); //保留在 LPM0中、直到所有数据
//是 TX
while (UCB0CTL1和 UCTXSTP); //确保已发送停止条件
}
}
//------------------
// USCIAB0TX_ISR 的结构使其可用于传输任何内容
//通过预加载 TXByteCtr 以及字节计数来指定字节数。 也称为 TXData
//指向要传输的下一个字节。
//------------------
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma VECTOR = USCI_B0_VECTOR
_interrupt void USCI_B0_ISR (void)
#elif defined (_GNUC__)
void __attribute__(((interrupt (USCI_B0_vector))) USCI_B0_ISR (void)
#else
错误编译器不受支持!
#endif
{
switch (__even_in_range (UCB0IV、12))
{
情形 0:中断; //向量 0:无中断
案例 2:中断; // Vector 2:ALIFG
案例 4:中断; // Vector 4:NACKIFG
案例 6:中断; // Vector 6:STTIFG
案例 8:中断; // Vector 8:STPIFG
案例10:中断; // Vector 10:RXIFG
情况12: // Vector 12:TXIFG
IF (TXByteCtr) //检查 TX 字节计数器
{
UCB0TXBUF =* PTxData++; //加载 TX 缓冲区
TXByteCtr --; //递减 TX 字节计数器
}
设计
{
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
UCB0IFG &=~μ s UCTXIFG; //清除 USCI_B0 TX int 标志
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
}
默认值:中断;
}
}