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.

[参考译文] MSP430F6638:运行时在 MSP430f6638上执行端口 mappping (UCB0 I2C/SPI)

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/928416/msp430f6638-port-mappping-ucb0-i2c-spi-during-runtime-on-msp430f6638

器件型号:MSP430F6638

你(们)好

我一直在尝试设置、并使用端口2上的 UCB0使用 I2C 和 SPI。 目的是在运行期间在这两个器件之间切换。

我面临的问题是、启用 I2C 后无法使 SPI 工作(如果不将 I2C 映射到端口2、则 SPI 工作。) -似乎端口映射造成了问题,但我并不完全确定(我已经查看了错误,找不到任何已知的相关问题)。  

我要做的是:在切换到 SPI 之前、我复位模块并清除两者之间的端口引脚状态。  

首先、我设置端口方向、状态等、然后我进行端口映射。 完成该操作后、我会初始化 SPI 或 I2C 的 UCB0、包括相关设置并启用模块(UCB0CTL1 &=~UCSWRST)

我想知道它是否与 UCBOCLK 和 UCB.S 一起使用、因为它们是一样的呢?

下面是如何完成映射的片段? 在运行时映射方面、我是否有误解?

////////////////////////////////////////////// 将 SPI 映射到 port2.x *////////////////////////////////
_disable_interrupt ();
PMAPPWD = 0x02D52;//将 SPI 映射到 port2.x
P2MAP0 = PM_UCB0CLK;
P2MAP1 = PM_UCB0SOMI;
P2MAP2 = PM_UCB0SIMO;
P2MAP3 = PM_NONE;
P2OMAP4 = PM_NONE;
PMAPPWD=0;
_enable_interrupt ();


////////////////////////////////////////////// 将 I2C 映射到 port2.x *//////////////////////////////////
_disable_interrupt ();
PMAPPWD = 0x02D52;//将 I2C 映射到 port2.x
P2MAP0 = PM_NONE;
P2MAP1 = PM_NONE;
P2MAP2 = PM_NONE;
P2MAP3 = PM_UCB0SDA;
P2OMAP4 = PM_UCB.S;
PMAPPWD=0;
_enable_interrupt ();

BR mm

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

    你(们)好

    我 在插件帖子中缺少 PMAPRECFG。

    我今晚会检查,但可能是我在某种程度上破坏了这一设置,只允许地图一次。

    _disable_interrupt ();
    PMAPPWD = 0x02D52;//将 I2C 映射到 port2.x

    PMAPCTL = PMAPRECFG;

    P2MAP0 = PM_NONE;
    P2MAP1 = PM_NONE;
    P2MAP2 = PM_NONE;
    P2MAP3 = PM_UCB0SDA;
    P2OMAP4 = PM_UCB.S;
    PMAPPWD=0;
    _enable_interrupt ();

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

    是的、忘记设置 PMAPRECFG 也是我的第一个猜测。  

    重新映射的顺序可能是明智的,先删除当前映射,然后再设置新映射。

    让我们知道结果如何。

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

    感谢您的反馈。 遗憾的是、它没有改变行为、实际上已经实现了。 我确实复位了该位、以便在运行时对其进行配置? 但看起来不是。 我将尝试查看 clk 是否实际上在为 SCL 定义的端口上挂起。

    我同意您的意见、但我在端口2上同时使用 SPI 和 I2C、但使用不同的端口引脚。 我认为这是一个很短的时间 在 SPI 和 I2C 通信之间切换时、我必须重新配置 SCL 和 CLK。 UCB0。

    下一步、我将再次查看我的代码中的 Psel 定义。

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

    我建议对语句重新排序、以便所有 PM_NONE 设置都优先。 其思路是避免 USCI 同时看到两组引脚。

    为每一个过渡安排 PMAPRECFG 也可能是"廉价保险"。 是的、UG 中的措辞说只需要第一次;我相信(几乎)我在书中读到的所有内容。

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

    嗯、我弄清楚映射发生了什么。

    我没有定义 PORT_MAP_RECFG!!! 我认为这一点是因为 PMAPCTL 寄存器中的 PMAPRECFG 位从未置位。

    在 I2C 首次初始化后、SPI 模块仍然无法正常工作。 至少现在第一个问题已经解决。 第二个问题可能与 I2C/USB0在启用时更改端口设置有关。 今晚、我希望能解决这个问题、以便我能够继续。 解决后、我会回来。

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

    解决了!! 这个问题比映射零件容易得多。 我忘记更改(清除) UCB0BR0/1 -啊。

    之前针对 I2C 进行了设置、与 SPI 设置不匹配。

    其他。 我的产品映射中包含以下内容、这些内容来自 TI 示例。

    由于我没有定义 PORT_MAP_RECFG、预处理器排除了"PMAPCTL = PMAPRECFG"、因此未编译!!   

    #ifdef port_map_RECFG
    //允许在运行时重新配置
    PMAPCTL = PMAPRECFG;
    #endif

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

    我很高兴您能正常工作。

    我不熟悉符号 port_map_RECFG。 使用此代码的代码是什么?

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

    我也不知道。 我认为它是在 msp430io.h 头文件中以某种方式定义的、但我错了、由于#ifdef 语句、编译器不会抱怨。

    我从 TI 示例中获取了一段代码、我应该深入研究每行的含义;我感到羞愧!!

    我可以做两件事来使它正常工作。 1) 1)在 头文件中定义 port_map_RECFG、或2)删除这些行。

    我真的不知道这段代码/语句的目的是什么

    我正在运行 IAR、但我不确定 CCS 预处理器/编译器如何针对此语句运行。