主题中讨论的其他器件: 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。提前感谢。

