如何解决两个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 举报,一经查实,本站将立刻删除。