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.

[参考译文] MSP430F5529:在 MSP430F5529上启动、停止、重新启动

Guru**** 2797795 points

Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/758924/msp430f5529-start-stop-restart-on-msp430f5529

器件型号:MSP430F5529

您好!

我需要在从模式下为 MSP430F5529写入 I2C 停止、启动和重新启动函数。 我分析了 TI slac300k 示例、但找不到任何线索。 我知道在主控模式下、我可以使用:

void stopCommand()
{
UCB1CTL1 |= UCTXSTP;
}
void startCommand()
{
UCB1CTL1 |= UCTR + UCTXSTT;
} 

但我不确定在从模式下使用什么。

我也不确定我的重新启动函数是否有意义。 请看一下。

下面是我的代码的其余部分:

void initI2C()
{
WDTCTL = WDTPW + WDTHOLD; //停止 WDT
P4SEL |= 0x06;//P3SEL |= 0x03; //将 I2C 引脚分配给 USCI_B1
UCB1CTL1 |= UCSWRST; //启用 SW 复位
UCB1CTL0 = UCMODE_3 + UCSYNC; // I2C 从设备,同步模式
UCB1I2COA = 0x48; //自有地址为048h
UCB1CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
UCB1IE |= UCTXIE + UCSTPIE + UCSTTIE; //启用 STT 和 STP 中断
}

void sendData (unsigned char*TxData,unsigned int 长度)
{
PTxData =(unsigned char *) TxData; // TX 缓冲区的开始

_bis_SR_register (LPM0_bits + GIE); //输入 LPM0,启用中断
//保持在 LPM0中直到主器件
//完成 RX
__no_operation(); //设置断点>>此处<<和
}

unsigned char receiveData()
{
PRxData =(unsigned char *) RxBuffer;// RX 缓冲区开始
RXByteCtr = 0; //清除 RX 字节计数
_bis_SR_register (LPM0_bits + GIE); //输入 LPM0,启用中断
//保持在 LPM0中直到主器件
//完成 TX
__no_operation(); //设置断点>>此处<<并读取
}

void startCommand()
{
}

void restart (int type)//1-接收器模式,2-发送器模式
{
MODE = TYPE;
开关(类型)
{
案例1:
UCB1CTL1 |= UCSWRST; //启用 SW 复位
UCB1CTL0 = UCMODE_3 + UCSYNC; // I2C 从设备,同步模式
UCB1I2COA = 0x48; //自有地址为048h
UCB1CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
UCB1IE |= UCSTPIE + UCSTTIE + UCRXIE; //启用 STT、STP 和 RX 中断
中断;
案例2:
UCB1CTL1 |= UCSWRST; //启用 SW 复位
UCB1CTL0 = UCMODE_3 + UCSYNC; // I2C 从设备,同步模式
UCB1I2COA = 0x48; //自有地址为048h
UCB1CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
UCB1IE |= UCTXIE + UCSTPIE + UCSTTIE; //启用 STT 和 STP 中断
中断;
默认值:
中断;
}
}









void stopCommand(){#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)#pragma vector = USCI_B1_Vector __interrupt void USCI_B1_ISR (void)#Elif defined (__GNU_)__attribute_(interrupt (USCI_B1_ISR)#vector

!#USCI_B1_ISR vector (void USC_B1_ISR)不支持)#pragma COMPLETE!
#endif
{
switch (__even_in_range (UCB1IV、12))
{
case 0:break; //向量0:无中断
情况2:中断; //向量2:ALIFG
情况4:中断; //向量4:NACKIFG
情况6: //向量6:STTIFG
UCB1IFG &=~UCSTTIFG; //清除启动条件 int 标志
中断;
案例8: //向量8:STPIFG
UCB1IFG &=~UCSTPIFG; //清除停止条件 int 标志
IF (RXByteCtr || MODE = 2) //检查 RX 字节计数器或发送模式
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);
中断;
案例10: //向量10:RXIFG
* PRxData++= UCB1RXBUF; //将 RX 字节放入缓冲区
RXByteCtr +;
中断;
案例12: //向量12:TXIFG
UCB1TXBUF =* PTxData++; //在地址 PTxData 发送数据
中断;
默认值:中断;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I2C 重新启动只是一个没有之前停止的启动、也就是说、置位或清零 UCTR、和置位 UCTXSTT。 请勿重置模块。

    在从机模式下、主控器件控制启动/停止。 当写入(接收)字节或读取字节(必须传输)时、您会获得中断。 您不关心其他任何事情(除非起始后的第一个字节具有不同的含义、例如寄存器地址)。

    发送和接收中断处理程序应检查长度以防止缓冲区溢出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    但我要连接的器件(主器件 DS2482)需要 I2C 启动和停止功能。  我可以将其留空吗?

    www.maximintegrated.com/.../3684

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DS2482是 I2C 从设备、因此 F5529必须是主设备。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦、好的、我觉得它也需要是 I2C 主设备。

    总之、我可以使用这些功能:

    void restart (int 类型)
    {
    UCB1CTL1 &=~UCTR; //设置接收器模式
    UCB1CTL1 |= UCTXSTT; //发送重新启动
    }
    void stopCommand()
    {
    UCB1CTL1 |= UCTXSTP;
    }
    
    void startCommand()
    {
    UCB1CTL1 |= UCTR + UCTXSTT;
    } 

    正确吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于 DS2482、这些是正确的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的帮助! )