尊敬的:
对于一个项目、我将连接两个 MSP、一个作为主器件、另一个作为从器件。 从属方将仅充当主控方的内存(主控方将向从属方写入地址和数据)。 有许多方法可以"解决"这一问题、但我的手被迫去做。
主器件将向从器件写入一个地址、并且还将一个引脚拉高(在从器件上不执行任何操作)、并将另一个引脚拉低(将在从器件上引起中断)。 这些引脚分别为3.0和3.1。 根据被拉至低电平的引脚、从器件将从主器件读取数据并将其存储在主器件提供的地址中、或者查看地址并将存储在该地址的数据写入主器件。
正如您可以想象的那样、当您执行此操作时、会出现很多时序问题(数据在引脚上停留的时间不够长等)。 我尝试使用引脚3.2来解决这个问题。 主器件仅在该引脚被拉至高电平时才会读取(它基本上会轮询整个时间、因为主器件此时不需要执行任何其他操作)。 写入时会发生相同的情况(大约 ISH)。 主器件将再次将该引脚推至低电平
主器件代码的段为:
空写入(uint16_t 地址、uint8_t 数据){ splitAndWriteAddress (address);//将端口中可用引脚上的地址拆分并写入。 P2DIR |= 0xFF; //将 dataIO 设置为写入模式 P3OUT |= BIT1; //禁用读取模式 P3OUT &=~BIT0; //激活写入模式 P2OUT =数据; //写入数据 while (!(P3IN & BIT2)){ __no_operation(); } P3OUT |= BIT0; //禁用写入模式 P3DIR |= BIT2; P3OUT &=~BIT2; P3DIR &=~BIT2; //P2DIR |= 0x00; //将 dataIO 设置为读取模式 }
uint8_t 读取(uint16_t 地址){ uint8_t data = 0x00; splitAndWriteAddress (地址); P2DIR &= 0x00; //将 dataIO 设置为读取模式 P3OUT |= BIT0; //禁用写入模式 P3OUT &=~BIT1; //激活读取模式 while (!(P3IN & BIT2)){ __no_operation(); } 数据= P2IN; P3OUT |= BIT1; //禁用读取模式 P3DIR |= BIT2; P3OUT &=~BIT2; P3DIR &=~BIT2; 返回数据; }
对于从器件、中断为:
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=PORT3_vector __interrupt void Port_3 (void) #elif defined (__GNU__) void __attribute__((interrupt (PORT3_vector)))) Port_3 (void 编译器#else 不支持! #endif { /* * 4个可用 RAM 段: * 1. D --> 1800h '到187Fh * 2. C -> 1880h '到18FFh * 3. b --> 1900h '直至187Fh * 4. a --> 1980h '直到19FFh * uint16_t volatile * address =(uint16_t *) getAddress ();//从端口获取地址 P3DIR |= BIT2; if (P3IFG & BIT0){ P2DIR &= 0x00;//置于读取模式 *地址= P2IN; P3OUT |= BIT2; } //写入 if (P3IFG & BIT1){//可以是其他类型 P2DIR |= 0xFF;//置于写入模式 P2OUT =*地址; P3OUT |= BIT2; } P3DIR &=~BIT2; P3IFG=0;//将所有标志设置为0 }
调试时,一切都正常(我使用 UART 连接进行测试),但当正常运行(在释放模式下)时,它不再运行(数据和地址都是通过正确给出的)。 这让我认为这仍然是一个计时错误、但我不知道如何以及为什么。
我还想在不使用该端口3.2的情况下就能做到这一点、但我还没有尝试过、因为我认为那里也会出现一些主要的时序问题、我现在不知道如何解决。
如果需要更多的代码、请咨询、但这些只是我认为最重要的代码。
此致。