0

对于一个项目,我将两个 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 的情况下做到这一点,但我还没有尝试过,因为我认为那里还会有一些我现在不知道如何解决的主要时间问题。

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

亲切的问候。

4

0 回答 0