This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR6989:从 PxIN 读取数据、输入变量并将其用作指针

Guru**** 2826755 points

Other Parts Discussed in Thread: MSP430FR6989

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/903258/msp430fr6989-reading-data-from-pxin-putting-in-variable-and-using-that-as-pointer

器件型号:MSP430FR6989

您好!

对于一个我正在使用2个 MSP430FR6989的项目、我需要它们以非常具体的方式相互通信(不能、我无法使用 I2C、SPI 或类似的其他协议)。 我需要使用 GPIO 端口通过一个地址提供(对于我来说、端口4、8和9)、而端口2通过数据提供。 然后、地址"转换"为存储数据的指针。  
但是、我似乎无法读取 PxIN 寄存器中的并将连接到地址。 我甚至无法读取整个 Port2并将其放入变量中。 我检查了数据总线是否通过寄存器(在 CCS 调试器中)通过、它们确实通过。 这里的问题是什么?

代码:  

#include 
#include "ram_module.h"

/**
* main.c
*/
int main (void)
{
PM5CTL0 &=~LOCKLPM5;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗定时器

//声明所有引脚
//控制端口
P3DIR |= 0b00000000;//第三个端口是 CSn 端口,这是只读
的 P3IE |= 0b00000111;
P3IES |= 0x03; //在前两个引脚
P3IFG 上从高电平到低电平&=~0x03;//清除标志
__bis_SR_register (GIE); //启用中断

//地址端口(端口1:5、端口8:4、端口9:7),只读
P1DIR |= 0b00000000;
P8DIR |= 0b00000000;
P9DIR |= 0b00000000;
//数据端口
P2SEL0 &= 0x00;
P2DIR |= 0x00;

//用于
调试 while (1)
__no_operation();
}

返回0;
}/*


每个端口只有一个矢量,只能写入一个 ISR。
*要区分一个中断矢量的不同中断源
、*在本例中为不同的端口引脚、您必须检查 ISR 中的 IFG 位。
//

#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

编译器#error!
#endif
{
uint16_t volatile * const address =(uint16_t *) getAddress ();
//uint16_t* data =空;
//data =地址;
if (P3IFG&BIT0){
//P1OUT^= BIT0;数据被写入这个 MPC
*地址= P2IN;
}
if (P3IFG&BIT1){//可以是另一个
//P1OUT^=BIT1;从 MPC 读取数据
P2DIR &= 0xFF;//置于写入模式
P2OUT =*地址;
//address =地址+ 8;
//P2OUT =*地址;
__no_operation();
P2DIR &= 0x00;//置于读取模式
}

P3IFG=0;//将所有标志设置为0

} 

和 getAddress()方法:  

内联 uint16_t getAddress(){
//uint16_t DATA_OUT = BYTE_MSB << 8 | BYTE_LSB;
uint16_t byte_msb = P9OUT & 0b01111111;
BYTE_MSB =(P9OUT << 8)|(P8OUT & 0b11110000);
short byte_LSB =(P1OUT & 0b11111000)>> 3;
uint16_t total_address = byte_msb << 1 | byte_LSB;
__no_operation();
__no_operation();
返回 TOTAL_ADDRESS;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    byte_MSB = (P9OUT << 8) | (P8OUT & 0b11110000);

    我认为您需要将 P9OUT 转换为16位。 您只需将8位数字8位移位、这会将所有位放入位桶中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    然后、当我执行以下操作时:  

    内联 uint16_t getAddress(){
    uint16_t byte_msb =(uint16_t) P9OUT & 0b0000000001111111;
    BYTE_MSB =(BYTE_MSB << 8)|((uint16_t) P8OUT & 0b00001110000);
    short byte_LSB =(P1OUT & 0b11111000)>> 3;
    uint16_t total_address = byte_msb << 1 | byte_LSB;
    __no_operation();
    __no_operation();
    返回 TOTAL_ADDRESS;
    } 

    它执行的操作完全相同。  
    在调试器中查看变量时、会给出 byte_msb 为256、byte_LSB 相同。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的标题是指 PxIN,但 getAddress()正在从 PxOUT 读取,这并不反映引脚的状态。 我认为您需要 P9IN、P8IN 等。

    ----------

    >        P2DIR &= 0xFF;  // put in write mode
    这不会将 P2引脚设置为输出模式。 尝试:
    >        P2DIR |= 0xFF;  // put in write mode

    ----------

    您尚未描述协议、但您并未给对方很长的时间(可能3-5 μ s)来接受数据。 在释放总线之前、您是否应该等待 P3.1再次变为低电平(或某种情况)?

     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这确实有助于读出而不是读出,我怎么不能理解这一点...
    谢谢!

    协议对时序非常重要、我仍在研究时序本身的需求。 不过、稍后释放总线可能是一个不错的选择。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可能希望从并行 SRAM 或 NAND-Flash 芯片中获取数据表、然后再利用它们的一些想法、更"适应"一些想法。 这些总线协议已经存在很久(有很多时间用于"学习体验")、而且速度非常快。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将深入了解它、谢谢!!

    BTW (有点偏离主题)、是否有任何原因导致我无法将数据放入指针中、数据似乎未存储在地址上。 这是因为 FRAM 的 MPU 吗? 或者我是否需要写入特定的地址范围、如果这样、我似乎无法在数据表中一目了然地找到它。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没关系、我找到了它。  
    对于遇到这种情况的人、FRAM 中有信息存储器段、您可以在其中写入这些数据。