请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28379D // //包含的文件 // #include "F28x_Project.h" // //定义函数 void I2CA_Init (void); uint16 I2CA_ReadData (uint16 reg_r); uint16 I2CA_WriteData (uint16 reg_t、uint16 reg_t 数据); // /uint16 ( void)/uint16 reg_int1;/uint16 influint16 (inuint1)/uint1、inuint1、inuint16和 uint1、inuint1、inuint1、inuint16和 uint1、inuint1、/uint1 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数位于 F2837xD_sysctrl.c 文件中。 // InitSysCtrl(); // //步骤2。 初始化 GPIO: //此示例函数位于 F2837xD_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 // InitGpio(); // 对于这个示例、只初始化 SCI-A 端口的引脚。 //这些函数可在 F2837xD_GPIO.c 文件中找到。 // EALLOW; GPIO_SetupPinMux (104、GPIO_MUX_CPU1、1); GPIO_SetupPinMux (105、GPIO_MUX_CPU1、1); // //步骤3。 清除所有__interrupts 并初始化 PIE 矢量表: //禁用 CPU __interrupts // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE _interrupts 并 清除标志//。 //此函数位于 F2837xD_PIECTRL.c 文件中。 // InitPieCtrl(); // 禁用 CPU __interrupts 并清除所有 CPU __interrupt 标志: // IER = 0x0000; IFR = 0x0000; // //初始化 PIE 矢量表,其中包含指向 shell 中断 //服务例程(ISR)的指针。 //这将填充整个表,即使在 本示例中未使用__interrupt //也是如此。 这对于调试很有用。 //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2837xD_PieVect.c 中找到 // InitPieVectTable(); I2CA_Init(); // for (;;) { I2CA_WriteData (0xE7、0xB6); DELAY_US (100); I2CA_ReadData (0xD0); DELAY_US (100); } } //********* // void I2CA_Init (void) { /* //初始化 I2C I2caRegs.I2CMDR.ALL = 0x0000; I2caRegs.I2CSAR.ALL = 0x76; //从器件地址 I2caRegs.I2CPSC.all = 8; //预分频器-模块时钟需要7-12MHz I2caRegs.I2CCLKL = 10; //注:必须为非零 I2caRegs.I2CCLKH=5; //注:必须为非零 //I2caRegs.I2CIER.ALL = 0x24; //启用 SCD 和 ARDY 中断0010 0100 I2caRegs.I2CIER.bit.AAS = 0; //寻址为从机中断使能位 I2caRegs.I2CIER.bit.SCD=1; //检测到停止条件中断使能位 I2caRegs.I2CIER.bit.XRDY=1; //发送数据就绪中断使能位 I2caRegs.I2CIER.bit.XRDY=1; //接收数据就绪中断使能位 I2caRegs.I2CIER.bit.ARDY = 1; //寄存器访问就绪中断使能位 I2caRegs.I2CIER.bit.nack = 0; //无确认中断使能位 I2caRegs.I2CIER.bit.ARBL = 0; //仲裁丢失中断使能位 //I2caRegs.I2CMDR.ALL = 0x0020; //使 I2C 退出复位,挂起时停止 I2C I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位 I2caRegs.I2CMDR.bit.FREE = 0; //挂起时停止 I2C I2caRegs.I2CMDR.bit.STT = 0; //起始条件位 I2caRegs.I2CMDR.bit.STP= 0; //停止条件位 I2caRegs.I2CMDR.bit.MST = 0; //从机模式 I2caRegs.I2CMDR.bit.TRX = 0; //接收器模式 I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式 I2caRegs.I2CMDR.bit.RM = 0; //非重复模式 I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用 I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块 I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式 I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式 I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位 //未使用 FIFO 返回; * I2caRegs.I2CSAR.ALL = 0x0076; //从机地址—EEPROM 控制代码 I2caRegs.I2CPSC.all = 16; //预分频器-模块时钟需要7-12MHz I2caRegs.I2CCLKL = 10; //注:必须为非零 I2caRegs.I2CCLKH=5; //注:必须为非零 I2caRegs.I2CIER.ALL = 0x24; //启用 SCD 和 ARDY __interrupts I2caRegs.I2CMDR.ALL = 0x0020; //使 I2C 退出复位 //挂起时停止 I2C I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式和 TXFIFO I2caRegs.I2CFFRX.ALL = 0x2040;//启用 RXFIFO、清除 RXFFINT 、} uint16 I2CA_WriteData (uint16 reg_t、uint16 data) { I2caRegs.I2CMDR.bit.IRS = 1; //复位 I2C //确保 I2C 不忙且已停止 while (I2cRegs.I2CSTR.bit.BB = 1); //忙循环 I2caRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位) while (I2caRegs.I2CMDR.bit.STP==1); //停止位循环 I2caRegs.I2CSAR.ALL = 0x76; // I2C 从地址 //while (I2cRegs.I2CSTR.bit.BB = 1); //仍然忙? I2caRegs.I2CCNT = 2; //假设寄存器地址= 1字节,数据为1字节 //I2caRegs.I2CMDR.ALL = 0x6E20; //开始,停止,无 rm,重置 i2c 01101110 00100000 I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位 I2caRegs.I2CMDR.bit.FREE = 1; //挂起时运行空闲 I2C I2caRegs.I2CMDR.bit.STT = 1; //起始条件位 I2caRegs.I2CMDR.bit.STP= 1; //停止条件位 I2caRegs.I2CMDR.bit.MST = 1; //主模式 I2caRegs.I2CMDR.bit.TRX = 1; //发送器模式 I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式 I2caRegs.I2CMDR.bit.RM = 0; //非重复模式 I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用 I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块 I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式 I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式 I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位 while (I2cRegs.I2CSTR.bit.XRDY = 0); //在巴士免费前什么也不做 I2caRegs.I2CDXR.all = reg_t; //传感器的寄存器地址(1个字节) I2caRegs.I2CDXR.All =数据; I2caRegs.I2CMDR.bit.STP= 1; // CNT=0时停止位 while (!I2cRegs.I2CSTR.bit.SCD); //等待停止条件 返回(1); } uint16 I2CA_ReadData (uint16 reg_r) { I2caRegs.I2CMDR.bit.IRS = 1; //复位 I2C //确保 I2C 不忙且已停止 while (I2cRegs.I2CSTR.bit.BB = 1); //忙循环 I2caRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位) while (I2caRegs.I2CMDR.bit.STP==1); //停止位循环 I2caRegs.I2CSAR.ALL = 0x76; // I2C 从器件地址 // while (I2cRegs.I2CSTR.bit.BB = 1); //仍然忙? //I2caRegs.I2CMDR.ALL = 0x2620; //开始、无停止位、主器件、TX、复位 I2C 00100110 I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位 I2caRegs.I2CMDR.bit.FREE = 0; //挂起时停止 I2C I2caRegs.I2CMDR.bit.STT = 1; //起始条件位 I2caRegs.I2CMDR.bit.STP= 0; //停止条件位 I2caRegs.I2CMDR.bit.MST = 1; //主模式 I2caRegs.I2CMDR.bit.TRX = 1; //发送器模式 I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式 I2caRegs.I2CMDR.bit.RM = 0; //非重复模式 I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用 I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块 I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式 I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式 I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位 I2caRegs.I2CCNT = 1; //假设寄存器地址为一个字节 while (I2cRegs.I2CSTR.bit.XRDY = 0); //在巴士免费前什么也不做 I2caRegs.I2CDXR.ALL = 0xD0; //传感器的寄存器地址(1个字节) while (!I2cRegs.I2CSTR.bit.ARDY); //准备好了吗? //I2caRegs.I2CMDR.ALL = 0x2C20; //开始、CNT = 0时的停止位、主器件、Rx、复位 I2C 00101100 I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位 I2caRegs.I2CMDR.bit.FREE = 0; //挂起时停止 I2C I2caRegs.I2CMDR.bit.STT = 1; //起始条件位 I2caRegs.I2CMDR.bit.STP= 1; //停止条件位 I2caRegs.I2CMDR.bit.MST = 1; //主模式 I2caRegs.I2CMDR.bit.TRX = 0; //接收器模式 I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式 I2caRegs.I2CMDR.bit.RM = 0; //非重复模式 I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用 I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块 I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式 I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式 I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位 I2caRegs.I2CCNT = 1; //只读取一个字节数据 if (I2cRegs.I2CSTR.bit.nack = 1) { I2caRegs.I2CSTR.All = I2C_CLR_Nack_bit;// 0x0002 } I2caRegs.I2CMDR.bit.STP= 1; // CNT=0时停止位 while (!I2cRegs.I2CSTR.bit.SCD); //是否检测到停止位? ID = I2caRegs.I2CDRR.All; //读取一个字节数据 返回(1); }