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.

[参考译文] 您好,我正在尝试编写一个有关 tm4c123gh6pm 和#39;s 硬件 IIC 中断的程序,但我遇到了问题。期待您的回复,谢谢。

Guru**** 2610595 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/764559/hello-i-am-trying-to-write-a-program-about-tm4c123gh6pm-s-hardware-iic-interrupt-but-i-have-a-problem-looking-forward-to-your-reply-thank-you

///这是我看到程序但我的中断无法进入的过程、我有两个问题、一个是:(1)在发送 ui32DataTx 内部、使用 I2CMasterControl (I2C0_BASE、//I2C_MASTER_CMD_BURST_SEND_START);//配置中断源:

// I2CSlaveIntEnableEx (I2C0_BASE I2C_SLAVE_INT_DATA);

//I2C_SLAVE_INT_STOP-STOP 条件检测中断

// i2c_slave_int_start-start 条件检测中断

// I2C_SLAVE_INT_DATA -数据中断

//这三个值的含义分别是什么

///这是我的程序

#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/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#define LED_ON GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0xFF);
定义从机地址 μ s
#define SLAVE_ADDRESS 0x3C
#define g_BIntFlag 0
接收的数据 μ s
uint32_t g_ui32DataRx;
中断标志位 μ s


串口初始化函数 μ s
空 InitConsole (空)

SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));

中断处理函数 μ s
空 I2C0SlaveIntHandler (空)

清除中断标志位 μ s
I2CSlaveIntClear (I2C0_BASE);
//从从从器件读取数据。
G_ui32DataRx = I2CSlaveDataGet (I2C0_BASE);
LED_ON;
//设置一个标志来指示中断发生。
// g_bIntFlag = 1;


void LED_init (void)

SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);

//配置 I2C0主机和从机,并使用环回模式连接它们。
int main (空)

uint32_t ui32DataTx;
/外部晶振作为时钟源16MHz
SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
LED_INIT ();
////////////////// 使能IIC μ A
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);

//启用环回模式。
HWREG (I2C0_BASE + I2C_O_MCR)|= 0x01;

//在处理器(NVIC)上启用 I2C0中断。
IntEnable (INT_I2C0);
//配置中断源:从机接收到数据产生中断 I2C_SLAVE_INT_STOP - Stop条件检测到中断 Ω
// I2C_SLAVE_INT_START - Start条件检测到中断 μ A
// I2C_SLAVE_INT_DATA 数据中断 Ω
I2CSlaveIntEnableEx (I2C0_BASE、I2C_SLAVE_INT_DATA);

//使能并初始化I2C0的主模块,I2C0模块使用系统时钟。
语句的最后一个参数是用来设定数据传输速率的。false表示传输速率是100kbps,true则意味着传输速率是400kbps。μ s
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);

//启用 I2C0从机模块。
I2CSlaveEnable (I2C0_BASE);
从机地址 μ s
I2CSlaveInit (I2C0_BASE、SLAVE_ADDRESS);

//false:主模块发送,从模块接收
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);

// InitConsole();
IntMasterEnable();

ui32DataTx = 0x33;
//把将发送的数据存入数据寄存器中


while (1)

I2CMasterDataPut (I2C0_BASE、ui32DataTx);

//主模块开始发送数据,模式:主机发送单字节数据
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);
//UARTCharPut (UART0_BASE、g_BIntFlag);

//等待中断发生。
// while (g_BIntFlag);

////中文

这就是我看的给的历程的程序但是我的中断进不去,我有两个疑问,一:1)里面发送 ui32DataTx(后,是用I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START)时为//μ s;

二:μ 配置中断源:μ μ A
//I2CSlaveIntEnableEx (I2C0_BASE、I2C_SLAVE_INT_DATA);

从机接收到数据产生中断 μ s I2C_SLAVE_INT_STOP - Stop条件检测到中断 μ s

// I2C_SLAVE_INT_START - Start条件检测到中断 μ A
// I2C_SLAVE_INT_DATA 数据中断 Ω

这三个分别什么意思我在库文件里没找到回答 μ s

////英文

///这是我看到程序但我的中断无法进入的过程、我有两个问题、一个是:(1)在发送 ui32DataTx 内部、使用 I2CMasterControl (I2C0_BASE、//I2C_MASTER_CMD_BURST_SEND_START);//配置中断源:

// I2CSlaveIntEnableEx (I2C0_BASE I2C_SLAVE_INT_DATA);

//I2C_SLAVE_INT_STOP-STOP 条件检测中断

// i2c_slave_int_start-start 条件检测中断

// I2C_SLAVE_INT_DATA -数据中断

//这三个值的含义分别是什么

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否在问 I2CMasterDataPut 和 I2CMasterControl 之间有何区别? 如果这是个问题、那么 I2CMasterDataPut 只是将要发送的数据放入 I2CMDR 寄存器中。 I2CMasterControl 是真正在总线上执行 I2C 传输的工具。 I2C 传输包括地址字节、然后是数据字节。 根据您在 I2CMasterControl 上指定的命令类型、I2C 的行为可能有所不同。 如果指定命令 I2C_MASTER_CMD_BURST_SEND_START、则 I2C 不会终止传输、因为它会使用停止位结束传输。 它只发送地址和第一个数据字节、然后 I2C 总线稍后将保持低电平。 您将需要发送最终的 I2C_MASTER_CMD_BURST_SEND_FINISH 命令来结束传输。 如果您只有一个字节的数据要发送、则可以发出 I2C_MASTER_CMD_SINGLE_SEND 命令。

    阅读此应用手册、其中将阐述如何使用 Tiva I2C 来发布各种类型的命令。 www.ti.com/.../spma073.pdf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、我知道 I2CMasterControl,谢谢。但我仍然不了解 IIC 的中断配置方法。还有 I2C_SLAVE_INT_STOP - Stop条件检测到中断 的区别
    // I2C_SLAVE_INT_START - Start条件检测到中断 μ A
    // I2C_SLAVE_INT_DATA 数据中断 Ω
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    以下是三种中断类型之间的差异。 如果您不熟悉 I2C 协议、请首先查看该协议。
    - I2C_SLAVE_INT_STOP 表示 I2C 从器件检测到了停止条件。 从器件检测到、在 SCL 线路从高电平切换到低电平之前、SDA 线路从高电压电平切换到低电压电平。
    - I2C_SLAVE_INT_START 表示 I2C 从器件检测到启动条件。 在 SCL 线路从低电平切换到高电平后、检测到的从器件 SDA 线路从低电压电平切换到高电压电平。
    - I2C_SLAVE_INT_DATA 意味着 I2C 将在接收或请求数据时生成中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我收到了您发送给我的文档。 现在我想为硬件 ILC 的 interrupt.l 配置 FIFO。l 检查了很多库文件和进程、但无法找到它们。l 期待您的回复
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    I2C 模块中没有 FIFO、因此您无法找到它。 UART、SSI 等其他通信外设具有 FIFO、但不具有 I2C。

    顺便说一下、您现在是否在中断上清除了? 当数据已经被传输或被一个主器件请求或者当检测到一个停止条件开始时、从器件生成中断。

    如果您对中断的问题得到解答、我将关闭此主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我没有听到您的反馈。 我假设我已回答了您的问题。 再次重申、I2C 模块中没有 FIFO。 当数据已经被传输或被一个主器件请求或者当检测到一个停止条件开始时、从器件生成中断。 我要关闭此主题。 如果您有新问题、您可以创建一个新的支持主题。