主题中讨论的其他器件: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);
}
我正在错误地配置器件?
谢谢