对于一个项目,我将两个 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 的情况下做到这一点,但我还没有尝试过,因为我认为那里还会有一些我现在不知道如何解决的主要时间问题。
如果需要更多代码,请询问,但这些只是我认为唯一重要的代码。
亲切的问候。