3199|6

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于44b0-IIC问题,请各位倘有帮忙看下 [复制链接]

我是在网上找的44b0的iic程序,但是在读写E2PROM是总是读出个ff,我的开发板用的是st24c08的E2PROM,这个问题困扰我很久了,我也对照了下时序,也没有发现什么问题,请各位坛友一定要帮这个忙啊!下面是程序:
void Test_Iic(void)
{
unsigned int i,j;
static U8 data[256];
pISR_IIC=(unsigned)IicInt;
rINTMSK=~(BIT_GLOBAL|BIT_IIC);

rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf); //Enable interrupt, IICCLK=MCLK/16, Enable ACK
//66Mhz/16/(15+1) = 257Khz
rIICADD=0x10; // S3C44B0X slave address

rIICSTAT=0x10;

Uart_Printf(0,"Write test data into KS24C080\n");

for(i=0;i<256;i++)
Wr24C080(0xa0,(U8)i,i);
for(i=0;i<256;i++)
data=0;

Uart_Printf(0,"Read test data from KS24C080\n");
for(i=0;i<256;i++)
Rd24C080(0xa0,(U8)i,&(data));

for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
Uart_Printf(0,"%2x ",data[i*16+j]);
Uart_Printf(0,"\n");
}

}


void Wr24C080(U32 slvAddr,U32 addr,U8 data)
{
_iicMode=WRDATA;
_iicPt=0;
_iicData[0]=(U8)addr;
_iicData[1]=data;
_iicDataCount=2;

rIICDS=slvAddr;
rIICSTAT=0xf0; //MasTx,Start
//Clearing the pending bit isn't needed because the pending bit has been cleared.
while(_iicDataCount!=-1);

_iicMode=POLLACK;

while(1)
{
rIICDS=slvAddr;//0xa0
_iicStatus=0x100;
rIICSTAT=0xf0; //MasTx,Start
rIICCON=0xaf; //resumes IIC operation.
while(_iicStatus==0x100);
if(!(_iicStatus&0x1))
break; // when ACK is received
}
rIICSTAT=0xd0; //stop MasTx condition
rIICCON=0xaf; //resumes IIC operation.
Delay(1); //wait until stop condtion is in effect.

//write is completed.
}


void Rd24C080(U32 slvAddr,U32 addr,U8 *data)
{
_iicMode=SETRDADDR;
_iicPt=0;
_iicData[0]=(U8)addr;
_iicDataCount=1;

rIICDS=slvAddr;
rIICSTAT=0xf0; //MasTx,Start
//Clearing the pending bit isn't needed because the pending bit has been cleared.
while(_iicDataCount!=-1);

_iicMode=RDDATA;

_iicPt=0;
_iicDataCount=1;

rIICDS=slvAddr+1;//这里是我自己加的1,不知道对不对,没有1的时候也是ff,看时序这里是读应该是1
rIICSTAT=0xb0; //MasRx,Start
rIICCON=0xaf; //resumes IIC operation.
while(_iicDataCount!=-1);

*data=_iicData[1];

}



void __irq IicInt(void)
{
U32 iicSt,i;
rI_ISPC=BIT_IIC;

iicSt=rIICSTAT;
if(iicSt&0x8){} // when bus arbitration is failed.
if(iicSt&0x4){} // when a slave address is matched with IICADD
if(iicSt&0x2){} // when a slave address is 0000000b
if(iicSt&0x1){} // when ACK isn't received

switch(_iicMode)
{
case POLLACK:
_iicStatus=iicSt;
break;

case WRDATA:
if((_iicDataCount--)==0)
{
rIICSTAT=0xd0; //stop MasTx condition
rIICCON=0xaf; //resumes IIC operation.
Delay(1); //wait until stop condtion is in effect.
//The pending bit will not be set after issuing stop condition.
break;
}
rIICDS=_iicData[_iicPt++]; //_iicData[0] has dummy.
for(i=0;i<100;i++); //for setup time until rising edge of IICSCL
rIICCON=0xaf; //resumes IIC operation.
break;

case RDDATA:
if((_iicDataCount--)==0)
{
_iicData[_iicPt++]=rIICDS;

rIICSTAT=0x90; //stop MasRx condition
rIICCON=0xaf; //resumes IIC operation.
Delay(1); //wait until stop condtion is in effect.
//too long time...
//The pending bit will not be set after issuing stop condition.
break;
}
_iicData[_iicPt++]=rIICDS;
//The last data has to be read with no ack.
if((_iicDataCount)==0)
rIICCON=0x2f; //resumes IIC operation with NO ACK.
else
rIICCON=0xaf; //resumes IIC operation with ACK
break;

case SETRDADDR:
//Uart_Printf("[S%d]",_iicDataCount);
if((_iicDataCount--)==0)
{
break; //IIC operation is stopped because of IICCON[4]
}
rIICDS=_iicData[_iicPt++];
for(i=0;i<100;i++); //for setup time until rising edge of IICSCL
rIICCON=0xaf; //resumes IIC operation.
break;

default:
break;
}
}
[ 本帖最后由 longbiao831 于 2011-11-2 09:54 编辑 ]
此帖出自ARM技术论坛

最新回复

接个示波器看看不就知道在哪里出错了吗,  详情 回复 发表于 2011-11-6 00:46
点赞 关注
 

回复
举报

19

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
楼主,麻烦你查看你的短消息哈,我给你发了信息,想问问你是否碰到Flash 烧写方面的问题,谢谢啦!IIC这块我还没调试,抱歉!希望坛友们帮忙解决哈。。。
此帖出自ARM技术论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 rocky_z 的帖子

我看到你的IIS问题 这个我没有看呢 我有现成的程序 老师调好的 还没有看  现在主要卡在这个IIC这里了
此帖出自ARM技术论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

4
 
我的IIS调试有点进展了,但是没有调通,心里头没有谱,你能不能把IIS调好的程序给我共享一下呢?非常谢谢!!!我的邮箱是:keepfastmoving@yahoo.com.cn谢谢!
此帖出自ARM技术论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

5
 
求助的问题怎么没有人解答呢?各位坛友,帮个忙吧,这个小问题困扰我好久了。
此帖出自ARM技术论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

6
 
接个示波器看看不就知道在哪里出错了吗,
此帖出自ARM技术论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

7
 
今天换了个实验板试了试,能够执行,输出正常,不知道怎么用示波器检测的,我们板子上的E2PROM是贴片的,求助怎么测啊,还有就是在读函数中进入POLLACK模式是干嘛的,感觉没有这个必要啊,还有根据时序图,在读操作的时候状态字应该是1的但是在程序中,地址没有变化啊,
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表