工具/软件:Code Composer Studio
大家好、我一直在使用 TMS320F28027的 I2C 模块。 我已经了解了很多现有的代码、我的代码看起来是一样的、但仍然不起作用。 我在中断中放置了一个断点,我使用 USB/I2C 模块向 C2000 Launchpad 发送命令,但仍然没有任何作用。 非常感谢您的帮助。
代码:
/**
* main.c
*
#include "DSP28x_Project.h"
#include "F2802x_common/include/clk.h"//时钟的标头
#include "f2802x_common/include/gpio.h"// GPIO 接头
#include "F2802x_common/include/PLL.h"// PLL 的标头
#include "F2802x_common/include/wdog.h"//看门狗头
#include "F2802x_common/include/i2c.h"//看门狗头
#include "F2802x_headers/include/F2802x_PieVect.h"// PIE 的标头
#include "F2802x_headers/include/F2802x_I2C.h"
#include "F2802x_common/include/F2802x_I2C_defins.h"
#include "myI2C.h"
void ioinit();
GPIO_Handle myGpio;
_interrupt void i2c_int1a_isr (void);
void I2CA_Init();
易失性 UINT16 I2CSTR_snapshot1;
易失性 UINT16 I2CSTR_snapshot2;
易失性 UINT16 I2CSTR_snapshot3;
void main()
{
//#ifdef _flash
// memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
//#endif
InitSysCtrl();
initI2CGpio();
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.I2CINT1A =&i2c_int1a_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
I2CA_Init();
PieCtrlRegs.PIEIER8.bit.INTx1 = 1;
//[???] 启用连接到 PIE 组8 (I2C)的 CPU INT8
IER |= M_INT8;
//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM
while (1)//此操作将无限期运行
{
DELAY_US (1000000);
}
}
#define ALT_B_SDA 0x00000001
#define ALT_B_SCL 0x00000004
#define GPAMUX1_CFG 0x00000000
#define GPAMUX2_CFG 0x00000000
#define GPBMUX1_CFG (ALT_B_SDA + ALT_B_SCL)
#define AIOMUX1_CFG (0x00003330)// AIO10-12-14为 AIO、其他为默认禁用
//方向寄存器对配置为外设功能的引脚没有影响。
#define GPIOA_DIR 0x00000000 //
#define GPIOB_DIR 0x00000000 //
#define AIO_DIR 0x00005400 // MUX_ADDR2-0仅用作 GPIO 输出
#define GPIOB_QSEL1 0xF000000F //异步输入 GPIO32 (SDA)和 GPIO33 (SCL)
空 initI2CGpio (空)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.ALL = 0x0000;// GPIO 功能 GPIO0-GPIO15
GpioCtrlRegs.GPAMUX2.ALL = 0x0000;// GPIO 功能 GPIO16-GPIO31
GpioCtrlRegs.GPBMUX1.ALL = 0x0000;// GPIO 功能 GPIO32-GPIO34
GpioCtrlRegs.AIOMUX1.ALL = 0x0000;
GpioCtrlRegs.GPADIR.ALL = 0x0000;// GPIO0-GPIO31是 GP 输入
GpioCtrlRegs.GPBDIR.ALL = 0x0000;// GPIO32-GPIO34是输入
GpioCtrlRegs.AIODIR.ALL = 0x0000;// AIO2、4、6、19、12、14是数字输入
//
GpioCtrlRegs.GPAQSEL1.ALL = 0x0000;// GPIO0-GPIO15同步到 SYSCLKOUT
GpioCtrlRegs.GPAQSEL2.ALL = 0x0000;// GPIO16-GPIO31同步到 SYSCLKOUT
GpioCtrlRegs.GPBQSEL1.ALL = 0x0000;// GPIO32-GPIO34同步到 SYSCLKOUT
//
//可以启用或禁用上拉
//
GpioCtrlRegs.GPAPUD.ALL = 0x0000;//上拉使能 GPIO0-GPIO31
GpioCtrlRegs.GPBPUD.ALL = 0x0000;//上拉使能 GPIO32-GPIO34
EDIS;
}
int myxdy = 20;
空 I2CA_Init()
{
I2caRegs.I2COAR = 0x60;//自有地址
I2caRegs.I2CPSC.all = 5;//预分频器-模块时需要7-12MHz (F2809:9)
I2caRegs.I2CCLKL = 10;//注意:必须为非零
I2caRegs.I2CCLKH = 5;//注意:必须为非零
I2caRegs.I2CCNT = 1;//获得1个字节
I2caRegs.I2CIER.ALL = 0x18;//清除中断(之前为0)
I2caRegs.I2CSTR.bit.RRDY = 1;//清除标志
I2caRegs.I2CIER.bit.RRDY = 1;//接收数据就绪中断
I2caRegs.I2CIER.bit.AAS = 0;//[2011-05-13、PP、v2.50]寻址为从器件现已禁用
I2caRegs.I2CIER.bit.XRDY = 1;//发送数据就绪中断
I2caRegs.I2CIER.bit.SCD = 1;//停止条件检测
I2caRegs.I2CMDR.ALL = 0x08A0;//使 I2C 退出复位
//挂起时停止 I2C
// A VOOOOOOOOOOOOOIR ********
// I2caRegs.rsvd1 &=~0x1;//[2018-04-26]清除 BCM 位(否则会导致 I2C 通信出现故障)
I2caRegs.I2CEMDR.bit.BCM =0;
I2caRegs.I2CMDR.bit.FREE = 1;
//启用此示例所需的中断
//在 PIE:组8中断1中启用 I2C 中断1
//PieCtrlRegs.PIEIER8.bit.INTx1 = 1;
I2caRegs.I2CFFRX.ALL = 0x2040;//启用 RXFIFO、清除 RXFFINT、
//[2011-05-10、PP、v2.??] 在使用新的 i2c_ISR 时非常重要
RxIndex = 0;
TxIndex = 0;
返回;
}
uint16_t myabc = 10;
_interrupt void
I2C_int1a_ISR (void)// I2C-A
{
char Flush;
flush = I2caRegs.I2CDRR;
myabc =myabc+2;
uint16_t IntSource;
IntSource = I2caRegs.I2CSTR.all;
//读取中断源
//IntSource = I2caRegs.I2CISRC.bit.INTCODE & 0x7;
//I2CSTR_snapshot2 = I2caRegs.I2CSTR.all;
switch (IntSource)
{
案例 I2C_NO_ISRC://=0
{
中断;
}
案例 I2C_ARB_ISRC://=1
{
中断;
}
案例 I2C_Nack_ISRC://=2
{
中断;
}
案例 I2C_ARDY_ISRC://=3
{
I2caRegs.I2CSTR.bit.ARDY = 0;
中断;
}
案例 I2C_AAS_ISRC://=7
{
中断;
}
案例 I2C_RX_ISRC://=4
{
中断;
}
案例 I2C_TX_ISRC://=5
{
中断;
}
案例 I2C_SCD_ISRC://=6
{
中断;
}
默认值:
asm (" ESTOP0");//在无效数字上停止。
}
I2CSTR_Snapshot3 = I2cRegs.I2CSTR.ALL;
//通过确认这个来启用进一步的 I2C (PIE 组8)中断。
PieCtrlRegs.PIEACX.ALL = PIEACK_group8;
}