This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP 低功耗微控制器论坛

Guru**** 2457760 points
Other Parts Discussed in Thread: MSP430F5529, MSP-EXP430F5529LP

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1439630/msp-low-power-microcontroller-forum

器件型号:MSP430F5529
主题中讨论的其他器件: MSP-EXP430F5529LP

工具与软件:

您好!
我正在使用 MSP430F5529写入 EEPROM AT24C256。 我修改了"MSP430F55xx_uscib0_i2c_08.c"示例代码。 我一直面临 NAK 错误。 请参考以下代码:
#include

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
  }  
 默认值:中断;
 }
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     for (i=0;i<10;i++);            //事务之间需要延迟

    此循环可能根本不会延迟、即使它甚至不接近 TWR (=10ms 或5ms)也是如此。 因此,第二次和后续的写入将是赤裸裸的。 请尝试改用类似以下内容:

    >__delay_cycles (10000); // twr=10ms (假设为1MHz CPU 时钟)

    ---

    A0/A1引脚是如何配置的? 更普遍地说:您是否使用商业分线板?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好!

    感谢您的答复。  

    我正在将 MSP-EXP430F5529LP MSP430F5529 LaunchPad 开发套件用于 USB。 A0/A1引脚符合 TI 提供的默认配置。

    这将尝试插入延迟并对您进行更新。

    此致、

    Yogesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 1)您如何告知它读数为0xFF? 您是否有读取操作的分析仪跟踪?

    2) 2)所有 LPM0_BITS 行似乎都已注释掉。 这些寄存器用于等待事务完成。 如果没有它们、函数返回得太早。

    3)我怀疑测试类似"if (! (UCNACKIFG & UCB0STAT)"、因为 UCNACKIFG 位于 UCB0IFG、而非 UCB0STAT。 尝试将对 EEPROM_AckPolling 的调用替换为"__delay_cycles (5000);// twr=5ms"等内容

    4) 4)我上面提到了"TWR=5ms"、但数据表(DOC0670)指的是"B"型号、其中 TWR=10ms。 它可以与封装标识区分开来、但我的(F5529) Launchpad 上没有 EEPROM、因此我无法进行检查。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好!

    包括延迟将有助于从 SAVE 获得 ACK。 感谢您的帮助