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.

[参考译文] MSP430F6779A:需要 I2C 引脚帮助以读取输入

Guru**** 2511415 points
Other Parts Discussed in Thread: MSP430F6779A, PCA9557

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/836515/msp430f6779a-need-help-with-i2c-pins-for-reading-input

器件型号:MSP430F6779A
主题中讨论的其他器件: PCA9557

我不熟悉 TI 器件(我使用的是 MSP430F6779A)和 I2C。 我学到了基本知识、但现在我面临一个问题。 我无法读取连接到 I/O 扩展器(从器件)、然后连接到微控制器 IC 的 I2C 引脚(SDA 和 SCL)的输入。 总共有8个连接到 I/O 扩展器的输入引脚、这些引脚的状态(高电平或低电平)可由 I2C 总线读取。 我的问题是、如何选择我希望读取其输入的 I/O 扩展器引脚。 假设从 DI1到 DI8的 I/O 扩展器上有8个输入引脚。 现在、我只想在 DI1读取输入。 我已通过读取 IO 扩展器(PCA9557)的数据表来分配正确的从器件地址。 数据表链接- http://www.ti.com/lit/ds/symlink/pca9557.pdf。 但是、如何选择我希望读取其输入的引脚(例如、 DI1)。 我已经对德州仪器提供的现有示例代码进行了更改。  

/*-版权所有-、BSD
*版权所有(c) 2016、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*--/copyrights-*/
#include "driverlib.h"

//*********
//! 此示例展示了如何将 I2C 模块配置为主器件//
! 中断驱动模式下的单字节接收。 从器件的地址
//! 主器件与之通信的模块、在本示例中也设置了该模块。
//!
//! 说明:此演示通过 I2C 总线连接两个 MSP430。 主
器件//! 从器件读取数据。 这是主代码。 从器件的数据
//! 发送器从0开始、每次传输都会递增。
//! USCI_B0 RX 中断用于知道何时接收到新数据。
//! ACLK = n/a、MCLK = SMCLK = BRCLK = DCO = 1MHz
//!
//! /|\/|\
//! MSP430F67791A 10k 10k MSP430F67791A
//! 从器件 || 主器件
//! -------- |||---
//! -|XIN P2.6/UCB0SDA|-|-|-+-|P2.6/UCB0SDA XIN|-
//! | || | | 32kHz
//! -|XOUT || | XOUT|-
//! | P2.5/UCB.S.|<---- >|P2.5/UCB.S. |
//! | | | P1.0|--> LED
//!

//! 此示例使用以下外设和 I/O 信号。 您必须
//! 查看这些内容并根据您自己的董事会需要进行更改:
//! - I2C 外设
//! - GPIO 端口外设(用于 I2C 引脚)
//! - SCL2
//! - SDA//
!
//! 此示例使用以下中断处理程序。 要使用此示例
//! 在您自己的应用程序中、您必须将这些中断处理程序添加到
您的//! 矢量表。
//! - USCI_B0_Vector。
//!
////
*****************
//
//
//设置从机模块的地址。 这是以
//以下格式发送的7位地址:
//[A6:A5:A4:A3:A1:A0:RS]
//
第一个字节的"RS"位置为零表示主
设备//发送(发送)数据到所选的从设备,而在该位置为1
表示主设备接收来自从设备的数据。
////
*****************

#define SLAVE_ADDRESS 0x33

uint8_t RXData;
void main (void)
{
//停止 WDT
WDT_A_HOLD (WDT_A_base);

//将 XT1频率设置为 UCS
UCS_setExternalClockSource (32768、0);

//为 I2C (UCB.S.、UCB0SDA)配置引脚
//将 P2.5和 P2.6设置为模块功能输入
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P4、
GPIO_PIN4 + GPIO_PIN5
);

GPIO_setAsOutputPin (GPIO_PORT_P5、
GPIO_PIN0 + GPIO_PIN7
);


EUSCI_B_I2C_initMasterParam param ={0};
param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = UCS_getSMCLK ();
param.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
param.byteCounterThreshold = 1;
param.autoSTOPGeneration =
EUSCI_B_I2C_SEND_STOP_INALOCK_ON_BYTECOUNT_THRESHOLD;
EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、param);

//指定从器件地址
EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、
从器件地址
);

//将主设备设置为接收模式
EUSCI_B_I2C_setMode (EUSCI_B0_BASE、
EUSCI_B_I2C_Receive_mode
);

//启用 I2C 模块以启动操作
EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);

EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、
EUSCI_B_I2C_Receive_INTERRUPT0 +
EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT
);
GPIO_setOutputLowOnPin (GPIO_PORT_P5、
GPIO_PIN7);
GPIO_setOutputHighOnPin (GPIO_PORT_P5、
GPIO_PIN7);
GPIO_setOutputLowOnPin (GPIO_PORT_P5、
GPIO_PIN0);
_DELAY_CYCLES (1000000);
while (1)
{
_DELAY_CYCLES (2000);

// I2C 启动条件
RXData = EUSCI_B_I2C_masterReceiveSingleByte (EUSCI_B0_BASE);//当我运行代码时、代码卡在这里。
GPIO_setOutputLowOnPin (GPIO_PORT_P5、
GPIO_PIN7);
if (RXData)
{
GPIO_setOutputHighOnPin (GPIO_PORT_P5、
GPIO_PIN0 + GPIO_PIN7
);
_DELAY_CYCLES (1000000);
}
其他
{
GPIO_setOutputHighOnPin (GPIO_PORT_P5、
GPIO_PIN7);
GPIO_setOutputHighOnPin (GPIO_PORT_P5、
GPIO_PIN0);
_DELAY_CYCLES (1000000);
}


}

我被卡住的函数代码就在这里。  

uint8_t eUSCI_B_I2C_masterReceiveSingleByte (uint16_t baseAddress)
{
//将 USCI 设置为接收模式
HWREG16 (baseAddress + OFS_UCBxCTLW0)&&~μ C UCTR;

//发送开始
HWREG16 (baseAddress + OFS_UCBxCTLW0)|=(UCTXSTT + UCTXSTP);

//轮询接收中断标志。
while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCRXIFG))
{
;
}

//发送单字节数据。
返回(HWREG16 (baseAddress + OFS_UCBxRXBUF));
} 

请帮我解决这个问题。 此外、我想问是否有任何监控器可以在微控制器 IC 上看到输入? 与 Arduino 中的串行监视器类似。 我将 JTAG 用作编程器/调试器、将 IAR 用作 IDE。提前感谢。  

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

    您好、耐受、

    在库函数中、您可以使用此函数读取输入引脚的状态。

    此 Web 链接可能已为您所用。

    http://dev.ti.com/tirex/explore/node?node=ACzawp9HkUMaRfbEzpt4ng__IOGqZri__LATEST

    对于其他问题、您可以将寄存器或 变量添加到表达式(右键单击选择"Add to Watch")、以便按顺序查看这些值。 例如:

    此致

    Johnson

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

    您好、耐受、

    我已经七天没有听到您的声音,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    此致、

    Johnson