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.

[参考译文] EK-TM4C1294XL:I2C 中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/827119/ek-tm4c1294xl-i2c-interrupt

器件型号:EK-TM4C1294XL

你(们)好

我无法从 I2C 获取中断。 以下设置代码是否正确?

//为 I2C 设置 PB2、PB3
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_2 | GPIO_PIN_3);
//基于 PB2、PB3的 I2C
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);

//启用 I2C0
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
//等待外设就绪
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0));

I2CMasterInitExpClk (I2C0_BASE、时钟、false);

I2CIntRegister (I2C0_BASE、I2C0_handler);

I2CMasterIntEnableEx (I2C0_BASE、I2C_MASTER_INT_STOP |
I2C_MASTER_INT_NACK |
I2C_MASTER_INT_DATA |
I2C_MASTER_INT_TIMEOUT);

I2CMasterEnable (I2C0_BASE);

如果我尝试向未连接的设备发送数据,我将接收 NACK 中断....

I2CMasterSlaveAddrSet (I2C0_BASE、0x55、false);

I2CMasterDataPut (I2C0_BASE、'*');
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
while (true);

但没有什么...

此致

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

    您好、Luca、

    您的代码中是否也有任何系统范围中断使能 API?

    我看到的只是 I2C 配置代码、但您还需要进行以下调用:

    ROM_IntEnable (INT_I2C0);
    ROM_IntMasterEnable (); 

    (ROM 前缀是可选的)

    此外、  您是否具有 SYSCTL_Periph_GPIOB 的 SysCtlPeripheralEnable?

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

    你(们)好

    现在我有中断、 不是添加代码、而是仅更改 SCL 和 SDA 的引脚设置、如下所示:

    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);

    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

    我认为 ARB 中断中断功能未启用。

    我希望使用中断、因为尝试使用轮询向未连接的外设发送命令我不会遇到任何错误、这是可能的吗?

    此致

     

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

    你(们)好

    查看 Tiva 数据表、我编写这个简单的轮询例程来写入2个或更多字节。 但是、如果我单步执行正确的代码、那么在没有任何连接的从器件的情况下、我也不会有错误???

    bool I2CWrite (uint8_t address、uint8_t count)
    {
    bool eito = false;
    bool end = false;
    
    G_i2c0.txptr = 0;
    //写入从机地址
    I2CMasterSlaveAddrSet (I2C0_BASE、地址、false);
    //写入数据
    I2CMasterDataPut (I2C0_BASE、g_i2c0.TXD[g_i2c0.txptr+]);
    //开始传输
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);
    //
    操作
    {
    while (I2CMasterBusy (I2C0_BASE));
    //
    if (I2CMasterErr (I2C0_BASE))
    {
    //中止传输
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_STOP);
    结束= true;
    }
    其他
    {
    //
    if (g_i2c0.txptr < count)
    {
    //写入下一个数据
    I2CMasterDataPut (I2C0_BASE、g_i2c0.TXD[g_i2c0.txptr+]);
    //继续传输
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);
    }
    其他
    {
    //完成传输
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
    while (I2CMasterBusy (I2C0_BASE));
    if (!I2CMasterErr (I2C0_BASE))
    {
    esito = true;
    }
    结束= true;
    }
    }
    while (!end);
    
    return( esito );
    }
    
    

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

    您好、Luca、

    很抱歉、我在第一个回复中没有看到引脚配置、很高兴您发现了这一点。

    关于没有从器件时缺少错误的问题、我的第一个想法是、也许您甚至不会看到 I2C 模块出现错误、但由于您有中断、这似乎不太可能。

    调试代码时、您是否实际到达 I2CMasterErr 行?

    您是否还在示波器上检查了信号的外观? 我猜、如果您遇到中断、您已经安装了上拉电阻器。

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

    您好 Ralph

    您说得对、我只使用中断时出错、但如果我使用轮询、我没有任何错误。 此外、我在轮询过程中有一个奇怪的行为、因为我昨天发送给您的代码只能执行不应运行的步进、就像数据寄存器将被覆盖... 今天、我使用中断进行了广告...

    注意事项

    卢卡  

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

    你(们)好

    如果我在 I2C 主中断过程中调用 I2CMasterErr(),而不是使用 I2CMasterBusy,那么我使用在 I2C 主中断过程中清除的标志,一切正常。

    此致