Thread 中讨论的其他器件:EK-TM4C1294XL
工具/软件:Code Composer Studio
我尝试获取2个字节并在每2个字节后生成中断、并将其存储在缓冲区中、我如何执行此操作。
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.
工具/软件:Code Composer Studio
我尝试获取2个字节并在每2个字节后生成中断、并将其存储在缓冲区中、我如何执行此操作。
您好!
您的 I2C 是主设备还是从设备?
如果您的 I2C 是主设备、请检查下面的帖子并查看它是否有用。
https://e2e.ti.com/support/microcontrollers/other/f/908/t/592966?TM4C123GH6PM-I2C-Interrupt-quesiton
我的器件(主器件)是 Tiva 板、从器件是压力传感器、我希望每2个字节获取数据并存储在缓冲器中
我随附了传感器数据表,我只需要压力字节 。
当两个字节完成后、重新启动
生成 中断并再次开始 、继续将数据存储在缓冲区中
您好!
您是否尝试将 TX 和 RX FIFO 配置为主器件、并将 FIFO 触发级别配置为2个字节。 如果您只需要 RX 中断、则可以移除 I2C_FIFO_CFG_TX_MASTER 和 I2C_FIFO_CFG_TX_TRIG_2。
I2CTxFIFOConfigSet (I2C0_BASE、 I2C_FIFO_CFG_TX_MASTER | I2C_FIFO_CFG_RX_MASTER | I2C_FIFO_CFG_TX_TRIG_2、I2C_FIFO_CFG_RX_TRIG_2);
启用 FIFO 中断。
I2CMasterIntEnableEx (I2C0_BASE、 I2C_MASTER_INT_RX_FIFO_REQ); // 如果您还想启用其他中断源、例如检测从器件或主器 件发送停止位的 NACK、则需要使用 I2C_MASTER_INT_STOP | I2C_MASTER_INT_NACK。
I2CMasterEnable (I2C0_BASE);
我写入此类型的代码、无法获取数据
我无法找到 缺少哪条线
#include
#include
#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "driverlib/flash.h"
#include "driverlib/SysTick .h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "driverlib/udma.h"
#include "driverlib/adc.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "grlib/grlib.h"
#include "grlib/widget.h"
#include "grlib/canvas.h"
#include "Kentec320x240x16_ssd2119_SPI.h"
//#include "drivers/Kentec320x240x16_ssd2119_spi.c"
#include "utils/uartstdio.h"
define I2C_NUM_DATA 500
/*为 I2C 状态机定义*/
#define I2C_MASTER_IDLE 0x0
#define I2C_MASTER_TX 0x1
#define I2C_MASTER_RX 0x2
#define I2C_MASTER_Anak 0x3
#define I2C_MASTER_DNAK 0x4
#define I2C_MASTER_ALST 0x5
#define I2C_MASTER_UNKN 0x6
void ConfigureGPIO (void);
void ConfigureI2C7 (void);
void I2C3_IRQHandler (void);
tContext sContext;
tRectangle sRect;
//
//定义 AMS5812 I2C 地址。
//
//
#define SLAVE_ADDRESS 0x78
//
//
//计数已调用的中断数的计数器。
//
//
静态易失性 uint32_t g_ui32Counter = 0;
//
//
//系统时钟速率,单位为 Hz。
//
//
uint32_t g_ui32SysClock;
//
//
//包含显示的中断指示符当前值的标志
//在 UART 上。
//
//
volatile uint_fast8_t g_ui32Flags;
volatile uint_fast8_t i2c_flag;
//
//
//驱动程序库遇到错误时调用的错误例程。
//
//
#ifdef 调试
无效
_error__(char * pcFilename、uint32_t ui32Line)
{
}
#endif
/* I2C 数据和状态机的变量*/
//uint8_t sendData[I2C_NUM_DATA]={0x04、0xA5、0x36、0x67、0x44};
uint8_t getData[I2C_NUM_DATA]={0};
uint8_t setI2CState;
uint8_t dataIndex;
空 I2C3_IRQHandler (空)
{
uint32_t getIntStatus;
uint32_t getERRStatus;
//获取中断状态并清除相同状态
getIntStatus = MAP_I2CMasterIntStatusEx (I2C4_base、true);
MAP_I2CMasterIntClearEx (I2C7 _BASE、getIntStatus);
//检查我们是否有数据请求
if ((setI2CState = I2C_MASTER_RX)&&(dataIndex < I2C_NUM_DATA-2))
{
Getdata[dataIndex++]= map_I2CMasterDataGet (I2C4_base);
MAP_I2CMasterControl (I2C7基础版、I2C_MASTER_CMD_BURST_Receive_contt);
}
否则、如果((setI2CState =I2C_MASTER_RX)&&(dataIndex =I2C_NUM_DATA-2))
{
Getdata[dataIndex++]= map_I2CMasterDataGet (I2C4_base);
MAP_I2CMasterControl (I2C7基础版、I2C_MASTER_CMD_BURST_Receive_finish);
}
//检查总线上是否有停止条件
if ((getIntStatus & I2C_MASTER_INT_STOP)=I2C_MASTER_INT_STOP)
{
if (setI2CState = I2C_MASTER_TX)
{
setI2CState = I2C_MASTER_IDLE;
}
否则、如果(setI2CState = I2C_MASTER_RX)
{
Getdata[dataIndex]= map_I2CMasterDataGet (I2C4_base);
setI2CState = I2C_MASTER_IDLE;
}
}
//检查 I2C 总线上是否存在 ADDR NAK、数据 NAK 或 ARB 丢失情况
if ((getIntStatus & I2C_MASTER_INT_NACK)== I2C_MASTER_INT_NACK)
{
//设置错误 LED
// map_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIO_PIN_0);
getERRStatus = MAP_I2CMasterErr (I2C4_base);
if ((getERRStatus & I2C_MASTER_ERR_ADDR_ACK)=I2C_MASTER_ERR_ADDR_ACK)
{
setI2CState = I2C_MASTER_Anak;
}
if ((getERRStatus & I2C_MASTER_ERR_DATA_ACK)=I2C_MASTER_ERR_DATA_ACK)
{
setI2CState = I2C_MASTER_DNAK;
}
if ((getERRStatus & I2C_MASTER_ERR_ARB_Lost)=I2C_MASTER_ERR_ARB_Lost)
{
setI2CState = I2C_MASTER_ALST;
}
}
}
//
//
//配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。
//
//
空配置 UART (空)
{
//
//启用 UART 使用的 GPIO 外设。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//
//启用 UART0。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//
//为 UART 模式配置 GPIO 引脚。
//
MAP_GPIOPinConfigure (GPIO_PA0_U0RX);
MAP_GPIOPinConfigure (GPIO_PA1_U0TX);
MAP_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
//
//初始化控制台 I/O 的 UART
//
UARTStdioConfig (0、115200、g_ui32SysClock);
}
//
//
//此示例应用演示了如何使用计时器生成计时器
//周期性中断。
//
//
int main (空)
{
//
//从 PLL 以120MHz 运行。
//注意:SYSCTL_CFG_VCO_240是 TivaWare 2.2.x 和中提供的新设置
//之后更好地反映由于 SYSCTL_22而导致的实际 VCO 速度。
//
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
ConfigureUART();
ConfigureGPIO();
配置 I2C7 ();
I2C3_IRQHandler();
G_ui32Counter = 0;
//初始化显示驱动程序。
// Kentec320x240x16_SSD2119Init (g_ui32SysClock);
//GrContextInit (&sContext、&g_sKentec320x240x16_SSD2119);
//启用处理器中断。
MAP_IntMasterEnable();
/*初始化 I2C 主设备的状态*/
setI2CState = I2C_MASTER_IDLE;
//在计时器运行时永久循环。
//
while (1)
{
/*初始化 Rx 的变量*/
setI2CState = I2C_MASTER_RX;
dataIndex = 0;
MAP_I2CMasterSlaveAddrSet (I2C1_base、SLAVE_ADDRESS、false);
MAP_I2CMasterControl (I2C7基础版、I2C_MASTER_CMD_BURST_Receive_start);
/*等待接收所有字节*/
while (setI2CState = I2C_MASTER_RX)
{
}
Getdata[dataIndex++];
}
}
//
//
//配置 GPIO 端口 N
//
//
空配置 GPIO (空)
{
//
//启用用于板载 LED 的 GPIO 端口。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
//
//为 LED (PN0和 PN1)启用 GPIO 引脚。
//
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0 |GPIO_PIN_1);
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_0 |GPIO_PIN_4);
}
//
//
//配置 I2C 端口
//
//
空配置 I2C7 (空)
{
//
//使用前必须启用 I2C7外设。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_I2C7);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);//
//
//等待 I2C0模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C7))
{
}
//为端口 D0和 D1上的 I2C7功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
//
MAP_GPIOPinConfigure (GPIO_PD0_I2C7SCL);
MAP_GPIOPinConfigure (GPIO_PD1_I2C7SDA);
//
//为这些引脚选择 I2C 功能。 此函数也会
//为 I2C 操作配置 GPIO 引脚,将其设置为
//开漏操作,弱上拉。 请参阅数据表
//查看每个引脚分配了哪些功能。
//
MAP_GPIOPinTypeI2CSCL (GPIO_PORTD_BASE、GPIO_PIN_0);
MAP_GPIOPinTypeI2C (GPIO_PORTD_BASE、GPIO_PIN_1);//
//启用到处理器的中断。
//
MAP_IntMasterEnable();
//
//启用和初始化 I2C7主机模块。 使用的系统时钟
// I2C7模块。 最后一个参数设置 I2C 数据传输速率。
//如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
//设置为400kbps。 在本示例中、我们将使用100kbps 的数据速率。
//
MAP_I2CMasterInitExpClk (I2C7基础版、g_ui32SysClock、false);
//
//为仲裁丢失、停止、NAK、时钟低电平启用中断
//超时和数据
//
MAP_I2CMasterIntEnableEx (I2C4_base、I2C_MASTER_INT_NACK |I2C_MASTER_INT_STOP|I2C_MASTER_INT_DATA);
/*初始化 I2C 主设备的状态*/
setI2CState = I2C_MASTER_IDLE;
MAP_IntEnable (I2C4_base);
}
当运行此代码时、启动文件出现错误、我经常提到 int Hendler 文件、但我无法理解是什么错误。
//
//
// startup_ccs.c -用于 TI Code Composer Studio 的启动代码。
//
//版权所有(c) 2013-2020 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
//德州仪器(TI)仅提供和使用此软件
//专门用于 TI 的微控制器产品。 该软件归其所有
// TI 和/或其供应商、受适用版权保护
//法律。 您不能将此软件与"病毒"开源软件结合使用
//软件,以便形成一个更大的程序。
//
//此软件按“原样”提供,且存在所有故障。
//不作任何明示、暗示或法定的保证,包括但
//不限于对适销性和适用性的暗示保证
//此软件的特定用途。 TI 不得以任何方式进行
//情况,对特殊、偶然或从属事件负责
//任何原因造成的损害。
//
//这是 EK-TM4C1294XL 固件包2.2.0.295版的一部分。
//
//
#include
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"
//
//
//转发默认故障处理程序的声明。
//
//
void ResetISR (void);
静态空 NmiSR (空);
静态空 FaultISR (空);
静态空 IntDefaultHandler (void);
//
//
//在时要调用的复位处理程序的外部声明
//处理器启动
//
//
extern void _c_int00 (void);
//
//
//标记栈顶的链接器变量。
//
//
extern uint32_t __stack_top;
//
//
//应用程序使用的中断处理程序的外部声明。
//
//
extern void Timer0IntHandler (void);
//extern void Timer1IntHandler (void);
void I2C3_IRQHandler (void);
//
//
//矢量表。 请注意、必须将适当的构造放置在到上
//确保它在物理地址0x0000.0000或开始处结束
//程序(如果位于0以外的起始地址)。
//
//
#pragma DATA_SECTION (g_pfnVectors、".intvecs")
void (* const g_pfnVectors [])(void)=
{
(void (*)(void)((uint32_t)&_stack_top)、
//初始堆栈指针
ResetISR、//复位处理程序
NmiSR、// NMI 处理程序
FaultISR、//硬故障处理程序
IntDefaultHandler、// MPU 故障处理程序
IntDefaultHandler、//总线故障处理程序
IntDefaultHandler、//用法故障处理程序
0、//保留
0、//保留
0、//保留
0、//保留
IntDefaultHandler、// SVCall 处理程序
IntDefaultHandler、//调试监视器处理程序
0、//保留
IntDefaultHandler、// PendSV 处理程序
IntDefaultHandler、// SysTick 处理程序
IntDefaultHandler、// GPIO 端口 A
IntDefaultHandler、// GPIO 端口 B
IntDefaultHandler、// GPIO 端口 C
IntDefaultHandler、// GPIO 端口 D
IntDefaultHandler、// GPIO 端口 E
IntDefaultHandler、// UART0 Rx 和 Tx
IntDefaultHandler、// UART1 Rx 和 Tx
IntDefaultHandler、// SSI0 Rx 和 Tx
IntDefaultHandler、// I2C0主设备和从设备
IntDefaultHandler、// PWM 故障
IntDefaultHandler、// PWM 发生器0
IntDefaultHandler、// PWM 发生器1.
IntDefaultHandler、// PWM 发生器2.
IntDefaultHandler、//正交编码器0
IntDefaultHandler、// ADC 序列0
IntDefaultHandler、// ADC 序列1.
IntDefaultHandler、// ADC 序列2.
IntDefaultHandler、// ADC 序列3.
IntDefaultHandler、//看门狗计时器
Timer0IntHandler、//计时器0子计时器 A
IntDefaultHandler、// Timer 0子计时器 B
IntDefaultHandler、//计时器1子计时器 A
IntDefaultHandler、//计时器1子计时器 B
IntDefaultHandler、//计时器2子计时器 A
IntDefaultHandler、//计时器2子计时器 B
IntDefaultHandler、//模拟比较器0
IntDefaultHandler、//模拟比较器1.
IntDefaultHandler、//模拟比较器2.
IntDefaultHandler、//系统控制(PLL、OSC、BO)
IntDefaultHandler、//闪存控制
IntDefaultHandler、// GPIO 端口 F
IntDefaultHandler、// GPIO 端口 G
IntDefaultHandler、// GPIO 端口 H
IntDefaultHandler、// UART2 Rx 和 Tx
IntDefaultHandler、// SSI1 Rx 和 Tx
IntDefaultHandler、//计时器3子计时器 A
IntDefaultHandler、//计时器3子计时器 B
IntDefaultHandler、// I2C1主设备和从设备
IntDefaultHandler、// CAN0
IntDefaultHandler、// CAN1
IntDefaultHandler、//以太网
IntDefaultHandler、// Hibernate
IntDefaultHandler、// USB0
IntDefaultHandler、// PWM 发生器3.
IntDefaultHandler、// uDMA 软件传输
IntDefaultHandler、// uDMA 错误
IntDefaultHandler、// ADC1序列0
IntDefaultHandler、// ADC1序列1.
IntDefaultHandler、// ADC1序列2.
IntDefaultHandler、// ADC1序列3.
IntDefaultHandler、//外部总线接口0
IntDefaultHandler、// GPIO 端口 J
IntDefaultHandler、// GPIO 端口 K
IntDefaultHandler、// GPIO 端口 L
IntDefaultHandler、// SSI2 Rx 和 Tx
IntDefaultHandler、// SSI3 Rx 和 Tx
IntDefaultHandler、// UART3 Rx 和 Tx
IntDefaultHandler、// UART4 Rx 和 Tx
IntDefaultHandler、// UART5 Rx 和 Tx
IntDefaultHandler、// UART6 Rx 和 Tx
IntDefaultHandler、// UART7 Rx 和 Tx
IntDefaultHandler、// I2C2主站和从站
IntDefaultHandler、// I2C3主设备和从设备
IntDefaultHandler、//计时器4子计时器 A
IntDefaultHandler、//计时器4子计时器 B
IntDefaultHandler、//计时器5子计时器 A
IntDefaultHandler、//计时器5子计时器 B
IntDefaultHandler、// FPU
0、//保留
0、//保留
IntDefaultHandler、// I2C4主设备和从属设备
IntDefaultHandler、// I2C5主设备和从设备
IntDefaultHandler、// GPIO 端口 M
IntDefaultHandler、// GPIO 端口 N
0、//保留
IntDefaultHandler、//篡改
IntDefaultHandler、// GPIO 端口 P (摘要或 P0)
IntDefaultHandler、// GPIO 端口 P1
IntDefaultHandler、// GPIO 端口 P2
IntDefaultHandler、// GPIO 端口 P3
IntDefaultHandler、// GPIO 端口 P4
IntDefaultHandler、// GPIO 端口 P5
IntDefaultHandler、// GPIO 端口 P6
IntDefaultHandler、// GPIO 端口 P7
IntDefaultHandler、// GPIO 端口 Q (摘要或 Q0)
IntDefaultHandler、// GPIO 端口 Q1
IntDefaultHandler、// GPIO 端口 Q2
IntDefaultHandler、// GPIO 端口 Q3
IntDefaultHandler、// GPIO 端口 Q4
IntDefaultHandler、// GPIO 端口 Q5
IntDefaultHandler、// GPIO 端口 Q6
IntDefaultHandler、// GPIO 端口 Q7
IntDefaultHandler、// GPIO 端口 R
IntDefaultHandler、// GPIO 端口 S
IntDefaultHandler、// SHA/MD5 0
IntDefaultHandler、// AES 0
IntDefaultHandler、// DES3DES 0
IntDefaultHandler、// LCD 控制器0
IntDefaultHandler、//计时器6子计时器 A
IntDefaultHandler、//计时器6子计时器 B
IntDefaultHandler、//计时器7子计时器 A
IntDefaultHandler、// Timer 7子计时器 B
IntDefaultHandler、// I2C6主设备和从设备
I2C3_IRQHandler、// I2C7主站和从站
IntDefaultHandler,// HIM 扫描矩阵键盘0
IntDefaultHandler、//单线0
IntDefaultHandler、// HIM PS/2 0
IntDefaultHandler、// HIM LED 序列发生器0
IntDefaultHandler、// HIM Consumer IR 0
IntDefaultHandler、// I2C8主设备和从设备
IntDefaultHandler、// I2C9主设备和从设备
IntDefaultHandler // GPIO 端口 T
};
//
//
//这是处理器首次开始执行时调用的代码
//重置事件之后。 仅执行绝对必要的设置、
//在此之后调用应用程序提供的 entry()例程。 任何花哨的东西
//操作(例如根据复位原因寄存器做出决策)、和
//重置该寄存器中的位)只能由控制
//应用。
//
//
无效
ResetISR (空)
{
//
//跳转到 CCS C 初始化例程。 这将启用
//浮点单元,因此不需要在此处执行此操作。
//
_asm (".global _c_int00\n"
" b.w _c_int00");
}
//
//
//这是当处理器接收到 NMI 时被调用的代码。 这种情况
//只需进入无限循环,保持系统状态以供检查
//由调试器执行。
//
//
静态空
NmiSR (空)
{
//
//输入无限循环。
//
while (1)
{
}
}
//
//
//这是处理器收到故障时调用的代码
//中断。 这只是进入一个无限循环、从而保持系统状态
//供调试器检查。
//
//
静态空
FaultISR (空)
{
//
//输入无限循环。
//
while (1)
{
}
}
//
//
//这是处理器收到意外时调用的代码
//中断。 这只是进入一个无限循环、从而保持系统状态
//供调试器检查。
//
//
静态空
IntDefaultHandler (空)
{
//
//进入无限循环。
//
while (1)
{
}
}
我看不到您像 下面那样调用 I2CTxFIFOConfigSet 来设置 FIFO 触发电平。 请参阅我的最后一个答复。
I2CTxFIFOConfigSet (I2C0_BASE、 I2C_FIFO_CFG_TX_MASTER | I2C_FIFO_CFG_RX_MASTER | I2C_FIFO_CFG_TX_TRIG_2、I2C_FIFO_CFG_RX_TRIG_2);
我看到许多示例、当时我不知道如何写入该类型的 config
I2CTxFIFOConfigSet (I2C0_BASE、 I2C_FIFO_CFG_TX_MASTER | I2C_FIFO_CFG_RX_MASTER | I2C_FIFO_CFG_TX_TRIG_2、I2C_FIFO_CFG_RX_TRIG_2);
调用函数,如果可能,我将使用该配置修改另一行,请在我的代码中修改。
谢谢你
#include
#include
#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "driverlib/flash.h"
#include "driverlib/SysTick .h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "driverlib/udma.h"
#include "driverlib/adc.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "grlib/grlib.h"
#include "grlib/widget.h"
#include "grlib/canvas.h"
#include "Kentec320x240x16_ssd2119_SPI.h"
//#include "drivers/Kentec320x240x16_ssd2119_spi.c"
#include "utils/uartstdio.h"
define I2C_NUM_DATA 500
/*为 I2C 状态机定义*/
#define I2C_MASTER_IDLE 0x0
#define I2C_MASTER_TX 0x1
#define I2C_MASTER_RX 0x2
#define I2C_MASTER_Anak 0x3
#define I2C_MASTER_DNAK 0x4
#define I2C_MASTER_ALST 0x5
#define I2C_MASTER_UNKN 0x6
void ConfigureGPIO (void);
void ConfigureI2C7 (void);
void I2C3_IRQHandler (void);
tContext sContext;
tRectangle sRect;
//
//定义 AMS5812 I2C 地址。
//
//
#define SLAVE_ADDRESS 0x78
//
//
//计数已调用的中断数的计数器。
//
//
静态易失性 uint32_t g_ui32Counter = 0;
//
//
//系统时钟速率,单位为 Hz。
//
//
uint32_t g_ui32SysClock;
//
//
//包含显示的中断指示符当前值的标志
//在 UART 上。
//
//
volatile uint_fast8_t g_ui32Flags;
volatile uint_fast8_t i2c_flag;
//
//
//驱动程序库遇到错误时调用的错误例程。
//
//
#ifdef 调试
无效
_error__(char * pcFilename、uint32_t ui32Line)
{
}
#endif
/* I2C 数据和状态机的变量*/
//uint8_t sendData[I2C_NUM_DATA]={0x04、0xA5、0x36、0x67、0x44};
uint8_t getData[I2C_NUM_DATA]={0};
uint8_t setI2CState;
uint8_t dataIndex;
空 I2C3_IRQHandler (空)
{
uint32_t getIntStatus;
uint32_t getERRStatus;
//获取中断状态并清除相同状态
getIntStatus = MAP_I2CMasterIntStatusEx (I2C4_base、true);
MAP_I2CMasterIntClearEx (I2C7 _BASE、getIntStatus);
//检查我们是否有数据请求
if ((setI2CState = I2C_MASTER_RX)&&(dataIndex < I2C_NUM_DATA-2))
{
Getdata[dataIndex++]= map_I2CMasterDataGet (I2C4_base);
MAP_I2CMasterControl (I2C7基础版、I2C_MASTER_CMD_BURST_Receive_contt);
}
否则、如果((setI2CState =I2C_MASTER_RX)&&(dataIndex =I2C_NUM_DATA-2))
{
Getdata[dataIndex++]= map_I2CMasterDataGet (I2C4_base);
MAP_I2CMasterControl (I2C7基础版、I2C_MASTER_CMD_BURST_Receive_finish);
}
//检查总线上是否有停止条件
if ((getIntStatus & I2C_MASTER_INT_STOP)=I2C_MASTER_INT_STOP)
{
if (setI2CState = I2C_MASTER_TX)
{
setI2CState = I2C_MASTER_IDLE;
}
否则、如果(setI2CState = I2C_MASTER_RX)
{
Getdata[dataIndex]= map_I2CMasterDataGet (I2C4_base);
setI2CState = I2C_MASTER_IDLE;
}
}
//检查 I2C 总线上是否存在 ADDR NAK、数据 NAK 或 ARB 丢失情况
if ((getIntStatus & I2C_MASTER_INT_NACK)== I2C_MASTER_INT_NACK)
{
//设置错误 LED
// map_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIO_PIN_0);
getERRStatus = MAP_I2CMasterErr (I2C4_base);
if ((getERRStatus & I2C_MASTER_ERR_ADDR_ACK)=I2C_MASTER_ERR_ADDR_ACK)
{
setI2CState = I2C_MASTER_Anak;
}
if ((getERRStatus & I2C_MASTER_ERR_DATA_ACK)=I2C_MASTER_ERR_DATA_ACK)
{
setI2CState = I2C_MASTER_DNAK;
}
if ((getERRStatus & I2C_MASTER_ERR_ARB_Lost)=I2C_MASTER_ERR_ARB_Lost)
{
setI2CState = I2C_MASTER_ALST;
}
}
}
//
//
//配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。
//
//
空配置 UART (空)
{
//
//启用 UART 使用的 GPIO 外设。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//
//启用 UART0。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//
//为 UART 模式配置 GPIO 引脚。
//
MAP_GPIOPinConfigure (GPIO_PA0_U0RX);
MAP_GPIOPinConfigure (GPIO_PA1_U0TX);
MAP_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
//
//初始化控制台 I/O 的 UART
//
UARTStdioConfig (0、115200、g_ui32SysClock);
}
//
//
//此示例应用演示了如何使用计时器生成计时器
//周期性中断。
//
//
int main (空)
{
//
//从 PLL 以120MHz 运行。
//注意:SYSCTL_CFG_VCO_240是 TivaWare 2.2.x 和中提供的新设置
//之后更好地反映由于 SYSCTL_22而导致的实际 VCO 速度。
//
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
ConfigureUART();
ConfigureGPIO();
配置 I2C7 ();
I2C3_IRQHandler();
G_ui32Counter = 0;
//初始化显示驱动程序。
// Kentec320x240x16_SSD2119Init (g_ui32SysClock);
//GrContextInit (&sContext、&g_sKentec320x240x16_SSD2119);
//启用处理器中断。
MAP_IntMasterEnable();
/*初始化 I2C 主设备的状态*/
setI2CState = I2C_MASTER_IDLE;
//在计时器运行时永久循环。
//
while (1)
{
/*初始化 Rx 的变量*/
setI2CState = I2C_MASTER_RX;
dataIndex = 0;
MAP_I2CMasterSlaveAddrSet (I2C1_base、SLAVE_ADDRESS、false);
MAP_I2CMasterControl (I2C7基础版、I2C_MASTER_CMD_BURST_Receive_start);
/*等待接收所有字节*/
while (setI2CState = I2C_MASTER_RX)
{
}
Getdata[dataIndex++];
}
}
//
//
//配置 GPIO 端口 N
//
//
空配置 GPIO (空)
{
//
//启用用于板载 LED 的 GPIO 端口。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
//
//为 LED (PN0和 PN1)启用 GPIO 引脚。
//
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0 |GPIO_PIN_1);
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_0 |GPIO_PIN_4);
}
//
//
//配置 I2C 端口
//
//
空配置 I2C7 (空)
{
//
//使用前必须启用 I2C7外设。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_I2C7);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);//
//
//等待 I2C0模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C7))
{
}
//为端口 D0和 D1上的 I2C7功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
//
MAP_GPIOPinConfigure (GPIO_PD0_I2C7SCL);
MAP_GPIOPinConfigure (GPIO_PD1_I2C7SDA);
//
//为这些引脚选择 I2C 功能。 此函数也会
//为 I2C 操作配置 GPIO 引脚,将其设置为
//开漏操作,弱上拉。 请参阅数据表
//查看每个引脚分配了哪些功能。
//
MAP_GPIOPinTypeI2CSCL (GPIO_PORTD_BASE、GPIO_PIN_0);
MAP_GPIOPinTypeI2C (GPIO_PORTD_BASE、GPIO_PIN_1);//
//启用到处理器的中断。
//
MAP_IntMasterEnable();
//
//启用和初始化 I2C7主机模块。 使用的系统时钟
// I2C7模块。 最后一个参数设置 I2C 数据传输速率。
//如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
//设置为400kbps。 在本示例中、我们将使用100kbps 的数据速率。
//
MAP_I2CMasterInitExpClk (I2C7基础版、g_ui32SysClock、false);
//
//为仲裁丢失、停止、NAK、时钟低电平启用中断
//超时和数据
//
MAP_I2CMasterIntEnableEx (I2C4_base、I2C_MASTER_INT_NACK |I2C_MASTER_INT_STOP|I2C_MASTER_INT_DATA);
/*初始化 I2C 主设备的状态*/
setI2CState = I2C_MASTER_IDLE;
MAP_IntEnable (I2C4_base);
}
我很难理解您。
您编写了 ConfigureI2C7函数、如下所示。 我只是要求您将 I2CTxFIFOConfigSet 插入函数中。
您有一些问题。
您是否可以 获得一个非中断模式 I2C 来工作? 这至少表示 MCU 正在与 I2C 器件通信、并且总线上有适当的上拉电阻器和正确的从器件地址。
-如果您在 I2C3_IRQHandler 中设置了断点,是否停止处理器? 首先要确保 I2C7正在生成中断。 如果你可以获得一个中断、那么你可以在生成一个中断前处理要接收的字节数量。
空配置 I2C7 (空)
{
//
//使用前必须启用 I2C7外设。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_I2C7);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);//
//
//等待 I2C0模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C7))
{
}
//为端口 D0和 D1上的 I2C7功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
//
MAP_GPIOPinConfigure (GPIO_PD0_I2C7SCL);
MAP_GPIOPinConfigure (GPIO_PD1_I2C7SDA);
//
//为这些引脚选择 I2C 功能。 此函数也会
//为 I2C 操作配置 GPIO 引脚,将其设置为
//开漏操作,弱上拉。 请参阅数据表
//查看每个引脚分配了哪些功能。
//
MAP_GPIOPinTypeI2CSCL (GPIO_PORTD_BASE、GPIO_PIN_0);
MAP_GPIOPinTypeI2C (GPIO_PORTD_BASE、GPIO_PIN_1);//
//启用到处理器的中断。
//
MAP_IntMasterEnable();
//
//启用和初始化 I2C7主机模块。 使用的系统时钟
// I2C7模块。 最后一个参数设置 I2C 数据传输速率。
//如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
//设置为400kbps。 在本示例中、我们将使用100kbps 的数据速率。
//
MAP_I2CMasterInitExpClk (I2C7基础版、g_ui32SysClock、false);
I2CTxFIFOConfigSet (I2C4_base、 I2C_FIFO_CFG_TX_MASTER | I2C_FIFO_CFG_RX_MASTER | I2C_FIFO_CFG_TX_TRIG_2、I2C_FIFO_CFG_RX_TRIG_2);
//
//为仲裁丢失、停止、NAK、时钟低电平启用中断
//超时和数据
//
MAP_I2CMasterIntEnableEx (I2C4_base、I2C_MASTER_INT_NACK |I2C_MASTER_INT_STOP|I2C_MASTER_INT_DATA);
/*初始化 I2C 主设备的状态*/
setI2CState = I2C_MASTER_IDLE;
MAP_IntEnable (I2C4_base);
}
我知道、如果您是新手、这里有一些学习曲线。 但是、这是您的学校项目、我不负责编写您的学校工作。 您的代码有什么问题? 您从未解释过哪些内容不适用于您的程序。 我们在此回答问题。 如果您不知道如何使用某些功能、并且需要有关程序调试的帮助、我们可以提供帮助。 我已经向您展示了如何调试程序。 我相信您可以做到这一点、只需遵循我提供的提示即可。 首先、在没有中断模式的情况下启动项目。 确保 MCU 正在与 I2C 器件成功通信。 接下来执行简单中断、以确保处理器可以响应中断请求。 在 I2C 中断服务例程中放置一个断点。 如果 CPU 响应中断、则它将在断点处停止。 一旦它运行、您就可以为主器件配置 RX FIFO、并将 FIFO 配置为在接收2个字节后生成中断。 我建议您也咨询您的 TA、同学或教授。