微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两个MSP430之间的时序错误通信

如何解决两个MSP430之间的时序错误通信

对于一个项目,我要相互连接两个MSP(MSP430FR6989),一个作为主设备(已提供了代码,我不能对其进行太多更改,因此无法使用SPI),另一个作为从设备。 。从属设备仅充当主设备的存储器扩展(主设备将向从设备写入地址和数据)。有很多“解决”问题的方法,但是我的双手被迫去做。

主机将向从机写入一个地址,并且还将拉高一个引脚(对从机不做任何事情),将另一个引脚拉低(将导致从机中断)。这些引脚分别为3.0和3.1。取决于哪个引脚被拉低,从机将从主机读取数据并将其存储在主机给定的地址中,或者将查看该地址并将该地址存储的数据写入主机。 >

您可以想象,仅执行此操作就会出现很多时序问题(数据在引脚上停留的时间不够长,等等)。我试图通过使用引脚3.2解决此问题。仅当该引脚被拉高时,主机才会读取(由于主机此时无需执行任何其他操作,因此它将基本上轮询整个时间)。写作时也会发生同样的事情(大约是ish)。主机将再次将该引脚压低

母版代码的片段为:

    void write(uint16_t address,uint8_t data){
    splitAndWriteAddress(address);  // splits up the address over the available pins in ports and writes it.
    P2DIR |= 0xFF;      // set dataIO in write mode
    P3OUT |= BIT1;      // deactivate read mode
    P3OUT &= ~BIT0;     // activate write mode
    P2OUT = data;       // write data
    while(!(P3IN & BIT2)){
        __no_operation();
    }
    P3OUT |= BIT0;      // deactivate write mode
    P3DIR |= BIT2;
    P3OUT &= ~BIT2;
    P3DIR &= ~BIT2;
    //P2DIR |= 0x00;      // set dataIO in read mode

}



    uint8_t read(uint16_t address){
    uint8_t data = 0x00;
    splitAndWriteAddress(address);
    P2DIR &= 0x00;      // set dataIO in read mode
    P3OUT |= BIT0;      // deactivate write mode
    P3OUT &= ~BIT1;     // activate read mode
    while(!(P3IN & BIT2)){
        __no_operation();
    }
    data = P2IN;
    P3OUT |= BIT1;      // deactivate read mode
    P3DIR |= BIT2;
    P3OUT &= ~BIT2;
    P3DIR &= ~BIT2;
    return data;
}

对于奴隶,我做了一个中断:

    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYstemS_ICC__)
#pragma vector=PORT3_VECTOR
__interrupt void Port_3(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(PORT3_VECTOR))) Port_3 (void)
#else
#error Compiler not supported!
#endif
{
    /*
     * 4 usable RAM sections:
     * 1. D --> 1800h 'till 187Fh
     * 2. C --> 1880h 'till 18FFh
     * 3. B --> 1900h 'till 187Fh
     * 4. A --> 1980h 'till 19FFh
     */
    uint16_t volatile * address = (uint16_t *) getAddress(); // gets the address from the ports
    P3DIR |= BIT2;


        if(P3IFG & BIT0){
            P2DIR &= 0x00;  // put in read mode
            *address = P2IN;
            P3OUT |= BIT2;
        }
        //WRITE
        if(P3IFG & BIT1){ //Could be an else
            P2DIR |= 0xFF;  // put in write mode
            P2OUT = *address;
            P3OUT |= BIT2;
        }

    P3DIR &= ~BIT2;

    P3IFG=0; // set all flags to 0
}

在调试时,一切正常(我使用UART连接进行测试),但是在正常运行时(在发布模式下),一切不再正常(数据和地址均正确给出)。这使我认为这仍然是一个计时错误,但是我不知道如何以及为什么。

我还认为我应该能够在不使用该端口3.2的情况下进行操作,但是我还没有尝试过,因为我认为那里还会存在一些我不知道如何解决的主要计时问题。现在。

如果需要更多代码,请询问,但这只是我认为唯一重要的代码

此致。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。