目前采用的查询方式,总线上挂了2个器件:24LC512和一个时钟IC,目前时钟没有问题了,就卡在存储器上,不知道是写不进去还是读不出来,相关代码如下:
初始化:
SMB0CN = 0x40; // SMBus Control Register,控制寄存器,这里只是使能I2C
SMB0ADR = 0x00; // SMBus Address Register,用于从模式时设置从地址
SMB0CR = 0x25; // SMBus Clock Rate Register,这里是在22.1184M 频率下算出的值
写操作:
/********************************************/
// 函数名称 : wr_iic
// 功 能 : 向从设备写入数据
// 入口函数 : iic_data ,数据;WiicAddr,从器件地址;n, 数据个数
// 出口函数 : --
// 说 明 : --
/********************************************/
void WR_iic(unsigned char* iic_data,unsigned char WiicAddr,unsigned int n)
{
unsigned int k;
if(WiicAddr==ADDR24512)EP24WP = 0;
else EP24WP = 1;
WiicAddr=WiicAddr&IIC_WD;
while(BUSY);
do
{
STO = 0;
STA = 1; // Send a start signal
//SI=0;
while(!SI);
while(SMB0STA!=0x08);
STA = 0;
SMB0DAT = WiicAddr ; //Send a ADRESS
SI=0;
while(!SI);
}while(SMB0STA!=0x18);
for(k=0;k<n;k++)
{
do
{
SI = 0;
SMB0DAT =iic_data[k] ;
while(!SI);
}while(SMB0STA!=0x28);
}
STO = 1;
SI = 0;
EP24WP = 1;
}
读操作:
/********************************************/
// 函数名称 : rd_iic24
// 功 能 : 向从设备写入数据
// 入口函数 : DEVAddr,从器件地址;n, 数据个数 ; Addr24 数据地址
// 出口函数 : iic_data ,数据;
// 说 明 : --
/********************************************/
void RD_iic24(unsigned char* iic_data,unsigned char DevAddr,unsigned int Addr24,unsigned int n)
{
unsigned int k;
unsigned char ADDr1,ADDr2;
unsigned char temp[2];
unsigned char rst =0;
if(DevAddr==ADDR24512)EP24WP = 0;
else EP24WP = 1;
ADDr1 = DevAddr&IIC_WD;
ADDr2 = DevAddr|IIC_RD;
temp[0] = Addr24>>8;
temp[1] = Addr24;
while(BUSY);
do
{
STO = 0;
STA = 1; // Send a start signal
while(!SI);
while(SMB0STA!=0x08);
STA = 0;
SMB0DAT = ADDr1 ; //Send a DEVICE ADRESS
SI=0;
while(!SI);
}while(SMB0STA!=0x18);
AA = 1;
for(k=0;k<2;k++)
{
do
{
SI = 0;
SMB0DAT =temp[k] ;
while(!SI);
}while(SMB0STA!=0x28);
}
SI = 0; //STO = 1;
do // begin to receive data
{
STO = 0;
STA = 1; // Send a start signal
while(!SI);
while(SMB0STA!=0x10);
SI = 0;
STA = 0;
SMB0DAT = ADDr2 ; //Send eeprom_read ADRESS
while(!SI);
}while(SMB0STA!=0x40);
SI = 0;
for(k=0;k<n-1;k++) //开始发送页数据
{
do
{
SI=0;
while(!SI);
iic_data[k] = SMB0DAT;
}while(SMB0STA!=0x50);
}
AA=0;
do //最后一个字节,发送非应答信号
{
SI=0;
while(!SI);
iic_data[n-1] = SMB0DAT;
}while(SMB0STA!=0x58);
STO = 1;
SI = 0;
EP24WP = 1;
}
大侠们看看问题在哪里
|