您好:
我需要EEPROM来存储有关控制电机的参数。 但粘贴了很多天,我无法做到,因为它对TI器件中的I2C非常困惑。 即使controlSuit有示例。
但 示例不是应用程序的通用编码器。 它在状态机中非常混乱。 如果发送编号超过2, 则不起作用 。
因此,我重新编码自己的程序 ,但无法读取。 我请求有人帮我检查我的代码。
注: 写入程序正常,未被卡住。但读取函数卡在 “ while (I2caRegs.I2CSTR.bit.XRDY ==0){}; ”中。
下面是我的代码:
Void I2CA_Init (void)
{
//初始化I2C
I2caRegs.I2CMDR.All = 0x0000;
I2caRegs.I2CSAR = 0; //从属地址
I2caRegs.I2CPsc.all = 6; //预分频器-需要7-12 MHz的模块clk
I2caRegs.I2CCLKL = 10; //注意:必须为非零
I2caRegs.I2CCLKH = 5; //注意:必须为非零
//I2caRegs.I2CIER = 0x24; //启用SCD和ARDY中断 0010 0100
I2caRegs.I2CIER.bit.AAS =0; //作为从属中断启用位寻址
I2caRegs.I2CIER.bit.SCD =0; //停止条件检测到中断启用位
I2caRegs.I2CIER.bit.XRDY =0;// 发送数据就绪中断启用位
I2caRegs.I2CIER.bit.RRDY =0; //接收数据就绪中断启用位
I2caRegs.I2CIER.bit.ARDY =0;// 寄存器-存取-就绪中断启用位
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位
//I2caRegs.I2CFFTX.ALL = 0x6000; //启用FIFO模式和TXFIFO
// I2caRegs.I2CFFTX.bit.I2CFFEN = 1; //启用I2C FIFO模式
// I2caRegs.I2CFFTX.bit.TXFFRST = 1; //启用传输FIFO操作
//I2caRegs.I2CFFTX.ALL = 0x0000; //禁用FIFO模式和TXFIFO
I2caRegs.I2CFFTX.Bit.I2CFFEN = 0; //启用I2C FIFO模式
I2caRegs.I2CFFTX.Bit.TXFFRST = 0; //启用传输FIFO操作
I2caRegs.I2CFFTX.bit.TXFFINTCLR = 0; //清除TXFFINT标志
I2caRegs.I2CFFTX.Bit.TXFFIENA = 0; // TXFFINT标志在设置时不生成中断
I2caRegs.I2CFFTX.Bit.TXFFIL = 0; //传输FIFO中断级别
//I2caRegs.I2CFFRX.ALL = 0x2040; //启用RXFIFO,清除RXFFINT
// I2caRegs.I2CFFRX.bit.RXFFRST = 1; //启用接收FIFO操作
// I2caRegs.I2CFFRX.bit.RXFFINTCLR = 1; //清除RXFFINT标志
//I2caRegs.I2CFFRX.ALL = 0x000; //禁用RXFIFO,清除RXFFINT
I2caRegs.I2CFFRX.bit.RXFFRST = 0; //启用接收FIFO操作
I2caRegs.I2CFFRX.bit.RXFFINTCLR = 0; //清除RXFFINT标志
I2caRegs.I2CFFRX.bit.RXFFIENA = 0; // RXFFINT标志在设置时会生成中断
I2caRegs.I2CFFRX.bit.RXFFIL = 0; //接收FIFO中断级别
}
Void WriteEeEe (I2caHandle p)
{
uINT8_t i;
//////////////////////////////////
//将数据写入EEPROM //
//////////////////////////////////
//I2C_SLAVE_ADDR = EEPROM的0x50地址
//我将'h','e','l','l','o'写入EEPROM,然后稍后再读回
//I2C_NUMBYTES = 5
//[MemoryHighAddr:MemoryLowAddr]- EEPROM中要读/写的地址
//Data[]有单词'hello',RxdData[]将存储从EEPROM读取的数据
I2caRegs.I2CSAR = p->diviceaddress; //设置从属地址
I2caRegs.I2CCNT = p->numbersend+ 2; //将计数设置为5个字符加2个地址字节
I2caRegs.I2CDXR = p->SNhighaddress; //发送EEPROM高地址
I2caRegs.I2CMDR.bit.TRX = 1; //设置为传输模式
I2caRegs.I2CMDR.Bit.MST = 1; //设置为主模式
I2caRegs.I2CMDR.bit.free = 1; //在自由模式下运行
I2caRegs.I2CMDR.bit.stp = 1; //内部计数器变为0时停止
I2caRegs.I2CMDR.bit.STT = 1; //发送起始位,传输将跟随
while (I2caRegs.I2CSTR.bit.XRDY == 0){}; //不执行任何操作,直到数据移出
I2caRegs.I2CDXR = p->Slowaddress; //发送EEPROM低地址
对于(i = 0;i < p->numbersend;I++){
while (I2caRegs.I2CSTR.bit.XRDY == 0){}; //不执行任何操作,直到数据移出
I2caRegs.I2CDXR = p->sendmemory[i]; //发送邮件
}
返回;
}
空读EEn (I2caHandle p)
{
uINT8_t i;
//////////////////////////////////
//从eeprom读取数据//
//////////////////////////////////
I2caRegs.I2CSAR = p->diviceaddress; //设置从属地址
I2caRegs.I2CCNT =2; //将计数设置为2个地址字节
I2caRegs.I2CDXR = p->Rhightaddress; //发送EEPROM高地址
I2caRegs.I2CMDR.bit.TRX = 1; //设置为传输模式
I2caRegs.I2CMDR.Bit.MST = 1; //设置为主模式
I2caRegs.I2CMDR.bit.free = 1; //在自由模式下运行
I2caRegs.I2CMDR.bit.stp = 0; //不要在Tx之后释放总线
I2caRegs.I2CMDR.bit.STT = 1; //发送起始位,传输将跟随
while (I2caRegs.I2CSTR.bit.XRDY == 0){}; //不执行任何操作,直到数据移出
I2caRegs.I2CDXR = p->Rlowaddress; //发送EEPROM low address
I2caRegs.I2CCNT = p->numberarive; //从EEPROM读取5个字节
I2caRegs.I2CMDR.bit.TRX = 0; //设置为接收模式
I2caRegs.I2CMDR.Bit.MST = 1; //设置为主模式
I2caRegs.I2CMDR.bit.free = 1; //在自由模式下运行
I2caRegs.I2CMDR.bit.stp = 1; //内部计数器变为0时停止
I2caRegs.I2CMDR.bit.STT = 1;//重复启动,接收将跟随
对于(i = 0;i < p->numberarive;i++)
{
I2caRegs.I2CSTR.bit.RRDY ==0){};//I2CDRR 未准备就绪,是否可以读取?
p->arrivermemory[i]= I2caRegs.I2CDRR;
}
返回;
}
在I2C.h中,有:
typedef结构
{
void (*writeEEprom)(void*);
void (*readEEprom)(void*);
uINT8_t直径地址; // eeprom设备地址
UINT8_t突出地址; // 发送数据地址高
UINT8_t Slowaddress; // 发送数据地址低
UINT8_t高地址;// 接收数据地址高
UINT8_t Rlowaddress; // 接收数据地址低
uINT16_t numbersend; // 发送数据个数
uINT16_t numberarive; // 接收数据个数
SENDI2CSTATE_STAT_e outi2cstate;//发送状态
ARRIVEI2CSTATE_STAT_e ini2cstate;//接收状态
uINT8_t * sendmemory;// 发送数组指针
UINT8_t * arrivermemory; // 接收数组指针
} I2CA_1;
typedef I2CA_1 * I2caHandle;
#define I2C_DEFAULT {\
(void(*)(void*)))WriteEeEeEn,\
(void(*)(void*)))ReadEee,\
0x50,\
0x00,\
0x00,\
0x00,\
0x00,\
10,\
10,\
SENDINACTIVE,\
RIVERINACTIVE,\
EepromBuff,\
EepromBuffin
}
在main.c中:
I2c_modul.writeeprom (myI2c); //
DELAY _US (100);
I2c_modul.readEEprom (myI2c);//
//空闲循环。 只需坐下来永远循环:
For (;;) //无限循环
{
BackTicker++;
//国家机器入口和出口点
//===================================================================================================================
(*Alpha_State_PTR)();// 跳至Alpha状态(A0,B0,...)
//===================================================================================================================
}
有人能帮我检查一下吗?哪里错了?
祝您一切顺利
谢谢
猎人