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.

[参考译文] MSP430G2102:CCS/MSP430G2102控制器作为从器件在从 lpm4模式唤醒时从主器件发送和接收数据。 问题是、在获取 USISRL 数据0xAA 后、我可以禁用引脚、但该引脚在瞬间一直保持高电平

Guru**** 663810 points
Other Parts Discussed in Thread: CC1310, MSP430G2102
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/986419/msp430g2102-ccs-msp430g2102-controller-as-a-slave-device-transmit-and-receive-data-form-the-master-device-on-wake-up-from-the-lpm4-mode-problem-is-that-after-getting-the-usisrl-data-0xaa-i-can-disable-the-pin-but-that-pin-is-

器件型号:MSP430G2102
主题中讨论的其他器件:CC1310

您好!

在这里、我将 MSP430G2102微控制器用作从器件、将 CC1310 TI 芯片用作主器件。

TI 芯片根据 GPIO 高电平/低电平唤醒。 我们在这里使用了 LPM4模式。

件在收到任何按键按压(P1.1、P1.2 P1.3、P1.4、P1.5)中断时唤醒。器件将按键数据传输到主器件。

主器件在接收到按键数据时发送 NACK、主器件发送数据0xAA 到 MSP430从器件。 一旦 MSP430从器件接收到0xAA、它将禁用 GPIO (端口引脚 P1.0)、从而切断 TI CC1310主芯片的电源。

但在开关情况10的其他部分、我面临的问题是、尽管在调试模式下、MSP430器  件接收到0xAA、但引脚 P1.0有时会变得较高、并通过以下语句(P1OUT &=~BIT1)保持永久高电平而不是低电平。  

在这里、请找到 i2c 从器件发送接收代码供您参考、并告知我以下查询。

1)在开关情况10中、其他部分虽然 MSP430器件获得0xAA、但 线路  (P1OUT &=~BIT1)不会使引脚永久处于低电平、但有时会一直保持高电平。 您能告诉我为什么会发生这种情况吗? 我的代码中的问题是什么。

2) 2)我是否在我所连接的代码中正确处理了低功耗模式4?

3) 3)为 我提供解决方案、以便在每次获取0xAA 时、GPIO 引脚 P1.0都被禁用、而这种禁用现在大部分时间都保持高电平。  

4) 4)代码中的 I2C 例程 是否正常?

代码:


#include

char flag=0;
char Slave_Tx = 1;
char SLV_Data = 0;//传输数据的变量
char SLV_Addr = 0x90;//对于 R/W、地址为0x48<1
INT I2C_STATE = 0;//状态变量
int i=0;


void i2c_init (void)

USICTL0 = USIPE6 + USIPE7 + USISWRST;//端口和 USI 模式设置
USICTL1 = USII2C + USIIE + USISTTIE;//启用 I2C 模式和 USI 中断
USICKCTL = USICKPL;//设置时钟极性
USICNT |= USIIFGCC;//禁用自动清除控制
USICTL0 &=~USISWRST;//启用 USI
USICTL1 &=~USIIFG;//清除挂起标志
_enable_interrupt ();

int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止看门狗

if (CALBC1_1MHz == 0xFF)// if 校准常数被擦除

while (1);//请勿加载,陷阱 CPU!!

DCOCTL = 0;//选择最低 DCOx 和 MODx 设置*/
BCSCTL1 = CALBC1_1MHz;//设置 DCO
DCOCTL = CALDCO_1MHz;

P1DIR |=(BIT7 + BIT6 + BIT0);//将 P1.0设置为输出方向
P1DIR &=~(BIT1 + BIT2 + BIT3 + BIT4 + BIT4);
P1OUT |=(BIT7 + BIT6);
P1OUT &=~BIT0;

P1IES |=(BIT1 + BIT2 + BIT3 + BIT4 + BIT4);// P1.1高/低边沿
P1IFG &=~(BIT1 + BIT2 + BIT3 + BIT4 + BIT4);// IFG 被清零
P1IE |=(BIT1 + BIT2 + BIT3 + BIT4 + BIT4);//中断被启用

I2C_init();

while (1)

if (flag==1)

P1OUT |= BIT0;

其他

P1DIR |= BIT0;
P1OUT &=~BIT0;
_bis_SR_register (LPM4_bits + GIE);

 }

//********
// USI 中断服务例程
//********
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USI_vector
_interrupt void USI_TXRX (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (USI_vector)) USI_TXRX (void)
其他
错误编译器不受支持!
#endif

if (USICTL1和 USISTTIFG)//开始输入?

I2C_STATE = 2;//开始时进入第一个状态

开关(I2C_STATE)

情况0://Idle、不应该在这里
中断;

案例2://RX 地址
USICNT =(USICNT & 0xE0)+ 0x08;//位计数器= 8、RX 地址
USICTL1 &=~USISTTIFG;//清除启动标志
I2C_STATE = 4;//转至下一状态:检查地址
中断;

案例4://处理地址并发送(N)Ack
IF (USISRL & 0x01)//如果读取...
SLV_Addr++;//保存 R/W 位
USICTL0 |= USIOE;// SDA =输出
if (USISRL =SLV_Addr)//地址匹配?

USISRL = 0x00;//发送确认
I2C_STATE = 8;//转至下一状态:TX 数据

其他

USISRL = 0xFF;//发送 NACK
I2C_STATE = 6;//转到下一状态:为下一个开始做好准备
flag=0;

USICNT |= 0x01;//位计数器= 1、发送(N) Ack 位
中断;

案例6://准备开始条件
USICTL0 &=~USIOE;// SDA =输入
SLV_Addr = 0x90;//复位从器件地址
I2C_STATE = 0;//复位状态机
中断;

情况8://发送数据字节
IF (Slave_Tx)

USICTL0 |= USIOE;// SDA =输出
USISRL = SLV_Data;//发送数据字节

其他

USICTL0 &=~USIOE;// SDA =输入

USICNT |= 0x08;//位计数器= 8、RX 数据
I2C_STATE = 10;//转至下一状态:测试数据和(N) Ack
中断;

案例10://接收数据(N)Ack
IF (Slave_Tx)

USICTL0 &=~USIOE;// SDA =输入
USICNT |= 0x01;//位计数器= 1、接收(N)确认
I2C_STATE = 12;//转至下一状态:检查(N) Ack

其他

//检查数据和 TX (N)确认
USICTL0 |= USIOE;// SDA =输出

如果(USISRL = 0xAA)//如果数据有效...

USISRL = 0x00;//发送确认
Slave_Tx = 1;
flag=0;

其他

USISRL = 0xFF;//发送 NACK

USICNT |= 0x01;//位计数器= 1、发送(N) Ack 位
I2C_STATE = 6;//转到下一状态:为下一个开始做好准备

中断;

案例12://处理数据确认/否定应答
if (USISRL & 0x01)//如果 NACK 被接收...

Slave_Tx = 0;

//准备开始条件
USICTL0 &=~USIOE;// SDA =输入
SLV_Addr = 0x90;//复位从器件地址
I2C_STATE = 0;//复位状态机
中断;

USICTL1 &=~USIIFG;//清除挂起标志

//端口1中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=Port1_vector
_interrupt void Port_1 (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (Port1_vector))) Port_1 (void)
其他
错误编译器不受支持!
#endif

IF (P1IFG 和 BIT1)

SLV_Data = 1;
P1IFG &=~BIT1;// P1.1 IFG 被清零

IF (P1IFG 和 BIT2)

SLV_Data = 2;
P1IFG &=~BIT2;// P1.2 IFG 被清零

中频(P1IFG 和 BIT3)

SLV_Data = 3;
P1IFG &=~BIT3;//复位 Port1中断标志

IF (P1IFG 和 BIT4)

SLV_Data = 4;//保存开关4的状态
P1IFG &=~BIT4;// P1.4 IFG 被清零

中频(P1IFG 和 BIT5)

SLV_Data = 5;//保存开关5的状态
P1IFG &=~BIT4;// P1.5 IFG 被清零

flag=1;
_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);

正在等待回复。

谢谢  

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

    您好!

    我无法查看 I2C 代码、但 P1.1连接到了什么?  此外、P1.1看起来像一个输入、这是正确的。  如果它是输入、则不能通过清零 OUT 寄存器强制将引脚置为低电平、因为它由外部器件驱动。  

    谢谢、

    JD

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

    您好!

    此处 P1.1是开关、P1.0是用于打开或关闭 TI 引脚电源的 LDO 引脚。 它只是在上面的线程 中错误地写入错误的状态(例如、P1OUT &=~BIT1)、而不是 P1OUT &=~BIT0。 但在所附的 I2C 代码中、它仅适用于 P1OUT &=~BIT0。 因此、在这里、P1.0我已配置为输出方向、在释放模式下随机给出 P1OUT &=~BIT0语句时、它不会变为低电平。 您能不能告诉我、我是否犯了任何错误、为什么会发生 uch 行为

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

    接收到0xAA 后、您设置了 FLAG = 0、但我看不到您唤醒 main 以查看该标志的位置。 这似乎是一种能产生你描述的症状的比赛。  

    未经请求:"标志"应声明为"易失性"。 如果您还没有遇到这种情况、您最终会遇到这种情况。

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

    您好!

    每次收到端口1 ISR 例程的中断时、MSP430器件都会被唤醒、其中标志变为1、命令"__BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);"使用此命令可使 MSP430器件退出 LPM4模式。  

    我将通过将标志声明为易失性来测试我的代码、并根据您的建议为您提供更新。

    但与此同时、您可以检查一下、请告诉我、我的代码中是否有任何其他需要注意的事项、而不是标记。

    因为我已经将 MSP430从设备代码从库示例本身中取出、但有时我遇到了地址 ACK 问题、有时最终无法获得0xAA、因此出现了一些随机行为。 有时也能正常工作。 那么 、我附加的代码中缺少的小东西需要小心、这样代码每次都能正常工作。

    感谢您的回复

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

    该代码在设置 FLAG = 1时执行唤醒操作、但在设置 FLAG = 0时、我看不到任何执行唤醒操作的代码。 我建议您添加如下内容:

    >_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);

    设置为0之后。