主题中讨论的其他器件:TM4C123
工具/软件:Code Composer Studio
大家好、
由于具有 I2C、我成功地只使用2根导线写入7段显示屏。 我开始喜欢这个协议。 因此、我决定用作输入扩展器、但现在我面临一些问题。
我正在尝试使用 PCF8574AP 输入、如果我没有弄错、当我将引脚拉至 GND 时、它应该会生成中断。 嗯、它确实会生成、但在芯片的 INT 端口中、而不是在 Tiva 上、并且 MCU 不会从 IC 中获取任何数据。 我尝试了主模式和从模式。
#include #include #include "inc/hw_i2c.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/i2c.h" #include "driverlib/interrupt.h" #include "driverlib.state" #define #define "driverlib_unic.h"#define "driverlib.ide"#define "driverlib.ide"#define #define "driverlib_ine.h"#define "driverlib_ine.h"#include "driverlib_ine.h"#define 0x38 //********* // //全局变量,用于保存已接收的 I2C 数据。 //// ***************** 静态 uint32_t g_ui32DataRx; //************* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } //********* // // I2C0数据从机中断的中断处理程序。 //// ***************** void I2C0MasterIntHandler (void) { // //清除 I2C0中断标志。 // I2CMasterIntClear (I2C0_BASE); // //从从从器件读取数据。 // G_ui32DataRx = I2CMasterDataGet (I2C0_BASE); // //显示已接收到中断。 // UARTprintf ("\n 主机中断已接收!\n"); // //显示从机已接收到的数据。 // UARTprintf ("已接收:'%s'\n\n"、g_ui32DataRx); } int main (void) { //init 时钟和 periph SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); SysCtlPeripheralEnable (SYSCTL_Periph_I2C0); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); GPIOPinConfigure (GPIO_PB2_I2C0SCL); GPIOPinConfigure (GPIO_PB3_I2C0SDA); GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2); GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3); // //在处理器(NVIC)上启用 I2C0中断。 // IntEnable (INT_I2C0); // //配置和打开 I2C0从机中断。 I2CSlaveIntEnableEx() //使您能够仅启用特定中断。 在本例中为 //我们仅在从设备接收数据时中断。 // I2CMasterIntEnableEx (I2C0_BASE、I2C_MASTER_INT_DATA); // //启用和初始化 I2C0主机模块。 使用的系统时钟 // I2C0模块。 最后一个参数设置 I2C 数据传输速率。 //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为 //设置为400kbps。 在本示例中、我们将使用100kbps 的数据速率。 // I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false); // //告诉主模块何时将在总线上放置什么地址 //与从设备通信。 将地址设置为 SLAVE_ADDRESS //(在从机模块中设置)。 接收参数设置为 false //表示 I2C 主设备正在向从设备发起写入操作。 如果 // true、这表示 I2C 主设备正在启动读取 //从器件。 // I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE); // //设置用于显示消息的串行控制台。 这只是 //对于此示例程序,正确的 I2C 操作不需要。 // InitConsole(); // //启用到处理器的中断。 // IntMasterEnable(); // //在控制台上显示示例设置。 // UARTprintf ("I2C 主机中断示例->"); UARTprintf ("\n 模块= I2C0"); UARTprintf ("\n 模式=主机模块上的接收中断"); UARTprintf ("\n 速率= 100kbps\n"); // //尝试在没有中断的情况下读取 // SysCtlDelay (SysCtlClockGet ()/3); // //从主设备读取数据。 // G_ui32DataRx = I2CMasterDataGet (I2C0_BASE); // //显示数据已接收。 // UARTprintf ("\n 接收到的主数据!\n"); // //显示主器件已接收的数据。 // UARTprintf ("已接收:'%s'\n\n"、g_ui32DataRx); while (1); }
作为从机中断:
#include #include #include "inc/hw_i2c.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/i2c.h" #include "driverlib/interrupt.h" #include "driverlib.state" #define #define "driverlib_unic.h"#define "driverlib.ide"#define "driverlib.ide"#define #define "driverlib_ine.h"#define "driverlib_ine.h"#include "driverlib_ine.h"#define 0x38 //********* // //全局变量,用于保存已接收的 I2C 数据。 //// ***************** 静态 uint32_t g_ui32DataRx; //************* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } //********* // // I2C0数据从机中断的中断处理程序。 //// ***************** void I2C0SlaveIntHandler (void) { // //清除 I2C0中断标志。 // I2CSlaveIntClear (I2C0_BASE); // //从从从器件读取数据。 // G_ui32DataRx = I2CSlaveDataGet (I2C0_BASE); // //显示已接收到中断。 // UARTprintf ("\n 接收到从机中断!\n"); // //显示从机已接收到的数据。 // UARTprintf ("已接收:'%s'\n\n"、g_ui32DataRx); } int main (void) { //init 时钟和 periph SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); SysCtlPeripheralEnable (SYSCTL_Periph_I2C0); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); GPIOPinConfigure (GPIO_PB2_I2C0SCL); GPIOPinConfigure (GPIO_PB3_I2C0SDA); GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2); GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3); // //在处理器(NVIC)上启用 I2C0中断。 // IntEnable (INT_I2C0); // //配置和打开 I2C0从机中断。 I2CSlaveIntEnableEx() //使您能够仅启用特定中断。 在本例中为 //我们仅在从设备接收数据时中断。 // I2CSlaveIntEnableEx (I2C0_BASE、I2C_SLAVE_INT_DATA); // //启用和初始化 I2C0主机模块。 使用的系统时钟 // I2C0模块。 最后一个参数设置 I2C 数据传输速率。 //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为 //设置为400kbps。 在本示例中、我们将使用100kbps 的数据速率。 // I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false); // //启用 I2C0从机模块。 // I2CSlaveEnable (I2C0_BASE); // //将从地址设置为 SLAVE_ADDRESS。 在回送模式下、它是一个 //发送到的任意7位数(在上面的宏中设置) // I2CMasterSlaveAddrSet 函数。 // I2CSlaveInit (I2C0_BASE、SLAVE_ADDRESS); // //告诉主模块何时将在总线上放置什么地址 //与从设备通信。 将地址设置为 SLAVE_ADDRESS //(在从机模块中设置)。 接收参数设置为 false //表示 I2C 主设备正在向从设备发起写入操作。 如果 // true、这表示 I2C 主设备正在启动读取 //从器件。 // I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE); // //设置用于显示消息的串行控制台。 这只是 //对于此示例程序,正确的 I2C 操作不需要。 // InitConsole(); // //启用到处理器的中断。 // IntMasterEnable(); // //在控制台上显示示例设置。 // UARTprintf ("I2C 从机中断示例->"); UARTprintf ("\n 模块= I2C0"); UARTprintf ("\n 模式=从机模块上的接收中断"); UARTprintf ("\n 速率= 100kbps\n"); // //尝试在没有中断的情况下读取 // SysCtlDelay (SysCtlClockGet ()/3); // //从从从器件读取数据。 // G_ui32DataRx = I2CSlaveDataGet (I2C0_BASE); // //显示数据已接收。 // UARTprintf ("\n 接收到从机数据!\n"); // //显示从机已接收到的数据。 // UARTprintf ("已接收:'%s'\n\n"、g_ui32DataRx); while (1); }
我正在错误地配置器件?
谢谢