部件号:LAUNCHXL-F2.8377万S
工具/软件:Code Composer Studio
您好,
我现在使用的是F2.8377万S启动板,我连接到24C16A EEPROM启动板的i2c通信引脚,我还将每个通信引脚上拉至3.3V电平。
但我不能将任何字节写入EEPROM,有人能帮我吗? I2C代码如下:
//###################################################################
//文件:example_2837xSI2c_eeprom
//标题:I2C EEPROM示例
//
//! \addtogroup cpu01_example_list
//! <h1>I2C EEPROM示例(i2c_eeprom)</h1>
//!
//! 此程序将向EEPROM写入1-14个单词并进行回读。
//! 写入的数据和写入的EEPROM地址将被包含
//! 在邮件结构中,I2cMsgOut1. 回读的数据将为
//! 包含在消息结构I2cMsgIn1.
//!
//! \b外部连接\n
//! -此程序需要连接到外部I2C EEPROM
//! 地址0x50处的I2C总线。
//
//###################################################################
//$TI发行版:F2837xS支持库v180 $
//$发布日期:星期五11月6日16:27:58 CST 2015 $
//$Copyright:版权所有(C) 2014-2015德州2015德州仪器(TI)公司-
// http://www.ti.com/ 保留所有权利$
//###################################################################
#include "F28x_Project.h"//设备头文件和示例包括文件
//注意:本示例中使用的I2C宏可在中找到
// F2837xS_I2C_defines.h文件
//本文件中找到的函数的prototype语句。
void I2CA_Init(void);
UINT16 ReadEEPROM (UINT16 eepromAdress);
void WriteEEPROM (UINT16 eepromAdress,UINT16数据);
UINT16 DataRead [256];
UINT16 EEPROM_MODE;
枚举eeprom_modes {write, read};
//__interrupt void i2c_int1a_isr (void);
作废通行证;
void fail (void);
#define I2C_SLAVE_ADDR 0x00
#define I2C_NUMBYTES 2.
//全局变量
//两个字节将用于外发地址,
//因此,最多只设置14个字节
UINT16 PassCount;
UINT16故障计数;
Void主(void)
{
// UINT16错误;
// UINT16 I;
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数可在F2837xS_sysctrl.c文件中找到。
InitSysCtrl();
//步骤2. 初始化GPIO:
//此示例函数可在F2837xS_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
伊尼特·格皮奥();
//在本例中,仅初始化SCI-A端口的引脚。
//在F2837xS_GPIO.c文件中可以找到这些函数。
GPIO_SetupPinMux (42,GPIO _MUX_CPU1,6);
GPIO_SetupPinMux (43,GPIO _MUX_CPU1,6);
//步骤3. 清除所有__interrupts并初始化PIE矢量表:
//禁用CPU __interrupts
色调;
//将PIE控制寄存器初始化到其默认状态。
//默认状态是所有PIE __interrupts禁用和标志
//被清除。
//此函数位于F2837xS_PIECTRL.c文件中。
InitPieCtrl();
//禁用CPU __interrupts并清除所有CPU __interrupt标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使是__interrupt
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程位于F2837xS_DefaultIsr.C.中
//此函数位于F2837xS_PieVect.C.中
InitPieVectorTable();
//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW;//这是写入EALLOW保护寄存器所必需的
//PieVectorTable.I2CA_INT =&i2c_int1a_isr;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的
//步骤4. 初始化设备外围设备:
I2CA_Init();
//步骤5. 用户特定代码
//清除计数器
PassCount = 0;
failcount = 0;
//启用本示例所需的__interrupts
//在PIE中启用I2C __interrupt 1:Group 8 __interrupt 1
//PieCtrlRegs.PIEIER8.bit.INTx1 = 1;
//启用连接到PIE组8的CPU INT8
IER || M_INT8;
EINT;
unsigned int j =0;
eeprom模式=写入;
//应用程序循环
对于(;;)
{
IF (eeprom_mode == write)
{
WriteEEPROM (j,10+j);
WriteEEPROM (j+1,10+j+1);
j=j+2;
如果(j>=200){
J = 0;
eeprom模式=读取;
DELAY _US (1e6);//等待1秒以读取模式
}
}
IF (eeprom_mode ==读取)
{
DataRead[j]= Readeeprom (j);
DataRead[j+1]= ReadEEPROM(j+1);
j=j+2;
如果(j>=200)
J = 0;
pass();
}
}// for的结束(;)
}//主页结束
Void I2CA_Init (void)
{
I2caRegs.I2CMDR.All = 0x0000;
//初始化I2C
I2caRegs.I2CSAL.ALL = I2C_SLAVE_ADDR;//从属地址- EEPROM控制代码
I2caRegs.I2CPsc.all = 6;//预分频器-需要7-12 MHz的模块clk
I2caRegs.I2CCLKL = 10;//注意:必须为非零
I2caRegs.I2CCLKH = 5;//注意:必须为非零
//I2caRegs.I2CIER = 0x24;//启用SCD和ARDY __interrupts
I2caRegs.I2CMDR.ALL = 0x0020;//0x0020;//从重置中取出I2C
//暂停时停止I2C
I2caRegs.I2CFFTX.ALL = 0x6000;//启用FIFO模式和TXFIFO
I2caRegs.I2CFFRX.ALL = 0x2040;//启用RXFIFO,清除RXFFINT,
返回;
}
UINT16读EEPROM (UINT16 eepromAddress)
{
UINT16寻址慢;
UINT16地址;
UINT16临时数据;
I2caRegs.I2CMDR.bit.IRS = 1;//重置I2C
while (I2caRegs.I2CSTR.bit.BB ==1);//忙循环
I2caRegs.I2CSTR.Bit.SCD =1;//清除SCD位(停止条件位)
while (I2caRegs.I2CMDR.bit.stp == 1);//停止位循环
addressigh = eepromAddress>8;
addressslow = eepromAddress;
I2caRegs.I2CSAL.ALL = I2C_SLAVE_ADDR;//0x0050;
while (I2caRegs.I2CSTR.bit.BB == 1);
I2caRegs.I2CMDR.ALL = 0x2620;// start,no stop bit,master,TX, 重置I2C
I2caRegs.I2CCNT = 0x0002;
I2caRegs.I2CDXL.ALL =地址;
I2caRegs.I2CDXL.ALL =地址慢;
while (!I2caRegs.I2CSTR.bit.ARDY);//是否全部就绪?
I2caRegs.I2CMDR.ALL = 0x2C20;//当CNT =0时启动,停止位,主,Rx,重置I2C
I2caRegs.I2CCNT = 1;
IF (I2caRegs.I2CSTR.bit.nack == 1)
{
I2caRegs.I2CSTR.All = I2C_CLR_nack_bit;// 0x0002
}
I2caRegs.I2CMDR.bit.stp = 1;//当CNT=0时停止位
while (!I2caRegs.I2CSTR.bit.SCD);//检测到停止位?
//tempddata = I2caRegs.I2CDRR << 8;//读取数据
tempddata = I2caRegs.I2CDRR.all;
DELAY _US (100);
return(tempda);
}
Void WriteEEPROM (UINT16 eepromAdress,UINT16数据)
{
UINT16寻址慢;
UINT16地址;
I2caRegs.I2CMDR.bit.IRS = 1;//重置I2C
addressigh =(eeepromAdress >>8)&0x00FF;
addressslow = eepromAdress和0x00FF;
I2caRegs.I2CSAL.ALL = I2C_SLAVE_ADDR;//0x0050;// EEPROM控制位+地址(A0-A2)。用于24LC256,0 1 0 1 0 A0 A1 A2
while (I2caRegs.I2CSTR.bit.BB == 1);
I2caRegs.I2CCNT =3;
I2caRegs.I2CMDR.ALL = 0x6E20;//启动,停止,无rm,重置i2c
I2caRegs.I2CDXL.ALL =地址;
I2caRegs.I2CDXL.ALL =地址慢;
// I2caRegs.I2CDXR =(数据>> 8)和0x00FF;//高字节数据
I2caRegs.I2CDXX.ALL =数据;//低字节数据
I2caRegs.I2CMDR.bit.stp = 1;//当CNT=0时停止位
while (!I2caRegs.I2CSTR.bit.SCD);//检测到停止位?
DELAY _US (5000);// 5ms = 24LC256的写入周期时间-基于数据表24LC256
返回;
}
void pass()
{
ASM (" ESTOP0");
for (;;);
}
void失败()
{
ASM (" ESTOP0");
for (;;);
}
//===========================================================================================================================================
//没有更多。
//===========================================================================================================================================
对于此代码,在WriteEEPROM()函数例程中挂起while循环;
