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.

[参考译文] CCS/EK-TM4C123GXL:使用 I2C PCF8574AP 输入、不会中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/590540/ccs-ek-tm4c123gxl-using-i2c-pcf8574ap-inputs-not-interrupting

器件型号:EK-TM4C123GXL
主题中讨论的其他器件: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);
}

我正在错误地配置器件?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您将 PCF8574AP 的 INT 引脚连接到了哪个引脚? 该引脚应连接到 GPIO、然后您需要配置 GPIO 以提供中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    但 I2C0中断又会怎样呢? 这不应取决于 INT 引脚。

    我尝试配置 GPIO 引脚以生成中断、但仍然没有从 PCF 获取数据。 I2C0中断从未被触发。

    我知道 PCF 具有弱上拉电阻器、为输入提供高电平、我尝试将引脚拉至 GND 以读取某些内容。 如果我将 P0、P1、P2、P3设为低电平、高电平、 高电平、高电平、我应该将0001 (或1000、其中一个)作为输出数据、对吧?

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

    公平地说、我必须指出您的问题实际上是关于了解 NXP PCF8574AP。 我的竞争对手 NXP 是该部件的正确权威。 从我读取的 数据表中可以看出、该器件只是一个 I2C 从器件。 因此、它无法直接启动 I2C 传输。 它们添加了一个开漏引脚、可用作处理器的 GPIO 中断请求。 以下内容来自 NXP 数据表:

    这种情况下、PCF8574AP 将 INT 引脚拉低。 连接到 TM4C123 GPIO 引脚、该引脚配置为在下降沿生成中断。 在中断例程中、TM4C 应发出 I2C 操作以读取 PCF8574AP。 如果您对 PCF8574AP 的操作还有其他疑问、请联系 NXP。

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

    [引用 user="Helder Sales"]嗯、它确实生成了数据、但在芯片的 INT 端口中、而不是在 Tiva 上、并且 MCU 不从 IC 中获取任何数据。 我尝试了主模式和从模式。[/quot]正如 Bob 所说的、 PCF8574AP 是 I2C 从模式。

    因此、为了使 Tiva 从 PCF8574AP 读取任何数据、Tiva 必须启动一个 I2C 主器件传输。 发布的主代码显示正在调用 I2CMasterDataGet (),但没有调用函数来实际启动 I2C 传输。

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

    这指向 O.P.

    当您报告使用其他 I2C 项目(即您(现在)选择的(非供应商)器件)取得成功时、将会面临巨大的挑战。   因此-它(可能)不是最佳选择。   您(可能)"通过功能集进行选择"-但"非常关注器件的运行细节"。   此器件要求苛刻!

    提供的数据供应商 Bob (非常友好)展示了一个强大的" gotcha "-您必须(首先)配置该器件的输入-并且只有在完成(成功)之后、该器件(可能-在严格条件下)才能输出警报信号!   和-仅当器件的输入发生变化时才会出现该输出(产生中断信号@ TM4C)!   (从他们的"输入端口寄存器状态"开始-祝您好运!)  

    因此、即使在 TM4C 发出第一个(成功)警报之前、您也有很多工作要做。   

    作为替代方案-您可以(无目的)尝试读取此器件-这节省了您控制复杂中断方案的必要-但事实证明它非常浪费。

    KISS 决定了一个更简单的器件-理想情况下由该供应商提供。   (或者至少您应该在此处"开始"。)

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

    可悲的是,我几乎要做的任何新的事情都是具有挑战性的,但我认为,坚持下去是重要的。 我总是试图雇用 kiss、但并非在所有情况下、我都可以依靠这种方式。

    很高兴、Bob 刚刚谈到了我需要听到的内容、不知怎么、我已经能够使器件正常工作。

    我将向有兴趣将 PCF8574AP 用作输入扩展器的任何人分享我的代码。

    #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/driverlib/interrupt.h"
    
    #include "driverlib#driverfrom.ide"
    
    
    
    
    
    、#include "driverlib/driverfrom.ide"#define #include "driverlib_rom.ide"#define #include "driverlib.ide"#include "driverlib_driverfrom.ide"#"driverlib.ide"#include "driverlib_rom.ide"#include "driverlib_driverlib.ide"、"driverlib.ide"#include "driverlib.ide"#"driverfrom.ide"#include "driverfrom.ide"#.
    0x38
    
    //从 PCF8574AP
    接收的8位数据易失性静态 uint8_t g_ui8DataRx;
    
    //初始化 UART 控制台
    内联空 InitConsole (void)
    {
    //
    //启用用于 UART0引脚的 GPIO 端口 A。
    // TODO:将其更改为您正在使用的 GPIO 端口。
    //
    MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOA);
    MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOA);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    while (!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOA));
    
    //
    //为端口 A0和 A1上的 UART0功能配置引脚复用。
    //如果您的器件不支持引脚复用、则无需执行此步骤。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    MAP_GPIOPinConfigure (GPIO_PA0_U0RX);
    MAP_GPIOPinConfigure (GPIO_PA1_U0TX);
    
    //
    //启用 UART0以便我们可以配置时钟。
    //
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    
    //
    //使用内部16MHz 振荡器作为 UART 时钟源。
    //
    MAP_UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
    
    //
    //为这些引脚选择替代(UART)功能。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    MAP_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    //
    //初始化控制台 I/O 的 UART
    //
    UARTStdioConfig (0、115200、16000000);
    }
    
    //由引脚 PD0
    上的下降沿生成的中断 void I2CInterruptPin (void)
    {
    //保存中断状态(查看哪个引脚触发了中断)
    uint32_t status = MAP_GPIOIntStatus (GPIO_PORTD_base、true);
    
    //清除中断状态
    MAP_GPIOIntClear (GPIO_PORTD_BASE、STATUS);
    
    //PD0是中断原因
    IF (STATUS & GPIO_PIN_0)
    {
    //从从从器件读取请求
    MAP_I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
    while (MAP_I2CMasterBusy (I2C0_BASE));
    
    //从主设备获取数据
    G_ui8DataRx = MAP_I2CMasterDataGet (I2C0_BASE);
    
    //打印接收到的数据
    UARTprintf ("接收到的中断、从器件读数(十进制):%03u\n"、g_ui8DataRx);
    }
    }
    
    //init Tiva
    内联 void InitPin (void)
    {
    //启用端口 D
    MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOD);
    MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOD);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    while (!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOD));
    
    //PD0作为输入
    MAP_GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_0);
    
    //使能上拉
    MAP_GPIOPadConfigSet (GPIO_PORTD_base、GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
    
    //清除挂起的中断
    MAP_IntDisable (INT_GPIOD);
    MAP_GPIOIntDisable (GPIO_PORTD_BASE、GPIO_PIN_0);
    MAP_IntPendClear (INT_GPIOD);
    MAP_GPIOIntClear (GPIO_PORTD_BASE、GPIO_PIN_0);
    
    //将中断配置为在下降沿激活
    MAP_GPIOIntTypeSet (GPIO_PORTD_BASE、GPIO_PIN_0、GPIO_FALLING_EDGE);
    //定义中断优先级(0x00最高、0xE0最低)
    MAP_IntPrioritySet (INT_GPIOD、0x00);
    //启用中断
    MAP_GPIOIntEnable (GPIO_PORTD_BASE、GPIO_PIN_0);
    MAP_IntEnable (INT_GPIOD);
    }
    
    //main 程序
    int main (void)
    {
    //将系统时钟设置为80MHz
    MAP_SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
    
    //初始化 UART
    InitConsole();
    
    //清除屏幕
    UARTprintf ("\033[2J");
    //将光标移动到位置0,0
    UARTprintf ("\033[0;0H");
    
    //init 引脚 PD0作为输入
    InitPin();
    
    //初始化 I2C0和 GPIOB
    MAP_SysCtlPeripheralDisable (SYSCTL_Periph_I2C0);
    MAP_SysCtlPeripheralDisable (SYSCTL_Periph_GPIOB);
    MAP_SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
    MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOB);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    while (!map_SysCtlPeripheralReady (SYSCTL_Periph_I2C0)||!map_SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
    
    //将 PB2配置为 SCL 和 PB3 SDA
    MAP_GPIOPinConfigure (GPIO_PB2_I2C0SCL);
    MAP_GPIOPinConfigure (GPIO_PB3_I2C0SDA);
    MAP_GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
    MAP_GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
    
    ///init I2C 主设备、100kbps (如果为真、则为400kbps)
    MAP_I2CMasterInitExpClk (I2C0_BASE、MAP_SysCtlClockGet ()、false);
    
    //设置从器件地址,主器件正在从从器件读取(如果为 false 则写入)
    MAP_I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
    
    //发送一个读取请求(需要在第一个中断之前执行该操作、
    //否则、当 MCU 复位时、它不会中断、或者根本不会中断)
    MAP_I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
    while (MAP_I2CMasterBusy (I2C0_BASE));
    
    //不执行任何操作(等待中断)
    while (1);
    }
    

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

    持久性可能无法证明与以下内容一样有用:

    • 搜索满足初始目标的各种器件
    • 合理地比较/对比工作需求

    然后才选择器件。

    很大程度上取决于您希望花费的时间/精力、以及器件的性能、尺寸和成本。

    设置这8个输入寄存器的状态(以便检测到变化并生成中断)的"必要性"似乎是一个负担。   尤其是在现实世界中、信号变化可能要快得多、频率也更高、这远远超出了您的"有限手工测试"(现在)允许和揭示的范围。

    您可能还想考虑器件的处理方式、"非常快速的更改"、尤其是发生了几次的更改-(之前)您可以响应中断和 I2C 的(宽松/缓慢)串行响应?  您的"工作"代码是否预期会出现这种情况?   那么、您愿意"错过"哪些输入信号?

    当然、您是从"距离"购买 I2C 器件的-我会使用一堆(高)的拉斯维加斯芯片、因为它的复杂性大大降低了它的销售吸引力。  (您可以比较/对比库存库存水平/移动-以衡量大多数器件的"受欢迎程度和使用水平"。  (这显然可能因大型公司的购买模式而"倾斜"、但总的来说、这证明是一个有效的"销售指标"。)   因为"销售"包含在您的论坛 ID 中-这可能值得您关注...

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

    实际上,我借用了这个 IC,这个器件并不便宜,很容易在这里找到(唯一让我感到困扰的是必须找到一个销售它的商店)。 我现在不需要使用它、我只是在实际需要它之前学习了如何使用它。

    实际上、我在使用 MCU 时所做的最"复杂"的事情就是在一段时间之前使用 Arduino 对洗碗机(电子面板已失效)进行编程。 现在、我将使用 Tiva 从小型 Baja 原型中获取数据、如燃油油位、RPM、速度、从方向盘发送命令(如设置精密仪)等

    但我希望有一天我所做的所有努力都能得到回报,如果不是,我至少会有知识。

    [引用 USER="CB1_MOBILE "]您可能还想考虑您的器件如何处理"非常快速的更改"、尤其是发生了几次的更改-(之前)您可以响应中断和 I2C 的(宽松/缓慢)串行响应?

    我知道这一不幸的缺点。 也许一种解决方案是使用 SPI (如果我需要)?

    [报价 USER="CB1_MOBILE "]因为"销售"包含在您的论坛 ID 中-这可能值得您关注...

    嗯、这是我的姓氏、我只是一个简单的电气工程学生、哈哈

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

    我不会期望"销售"为您的姓氏! 我是否可以建议您"复制/转发"我的"器件选择标准"给"选择该器件"的他/她?

    您对 SPI 的想法-由于其"100x"加速(100KHz 与10MHz)、确实得到了极大的改进。  

    您和其他人都学到了宝贵的经验、" I/O 扩展"的目标是通过大多数方法实现的、但成本(有些降低了性能)!   而且、成本和"易用性"必须得到公平的考虑...