优龙S3C44B0X 的IIC驱动问题

yourtse yourtse 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
具体代码如下:
有时候读写的时候,特别是写EEPROM的时候出现死机,即 while(_iicDataCount!=-1);在这一句处循环,无法退出。
但是又不确定,有时候又是好的,请问不知道哪里错了,望高手不吝赐教!!

谢谢!
========================
========================
void Iic_initial(void)
{
pISR_IIC = (UINT32) IicInt; /* EEPROM 中断入口 */

// enable IRQ IIC
rINTMSK &= (~BIT_IIC) ;

// initialize IIC module
rPCONF |= 0xa; //PF0:IICSCL, PF1:IICSDA
rPUPF |= 0x3; //pull-up disable

//Enable ACK generation, IICCLK=MCLK/16, Enable interrupt,IIC-Bus transmit clock prescaler (15+1)
//66000000hz/16/(15+1) = 257Khz (257812.5)
rIICCON = (1<<7) | (0<<6)| (1<<5) | (0xf);

rIICADD = 0x10; // S3C44B0X slave address

rIICSTAT = 0x10; // 1=Enable Rx/Tx
}

void Wr24C040(UINT32 slvAddr,UINT32 addr,UINT8 data)
{
_iicMode=WRITE_DATA;
_iicPt=0;
_iicData[0]=(UINT8)addr;
_iicData[1]=data;
_iicDataCount=2;

rIICDS=slvAddr;//0xa0
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;
_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.
}


SINT32 Rd24C040(UINT32 slvAddr,UINT32 addr,UINT8 *data)
{
UINT32 timeout;

_iicMode=SETRDADDR;

_iicPt=0;
_iicData[0]=(UINT8)addr;
_iicDataCount=1;

rIICDS=slvAddr;
rIICSTAT=0xf0; //MasTx,Start
//Clearing the pending bit isn't needed because the pending bit has been cleared.

timeout = 0xffff ;
while(_iicDataCount!=-1)
{
if (timeout-- == 0)
{
return -1 ;
}
}

_iicMode=READ_DATA;

_iicPt=0;
_iicDataCount=1;

rIICDS=slvAddr;
rIICSTAT=0xb0; //MasRx,Start
rIICCON=0xaf; //resumes IIC operation.

timeout = 0xffff ;
while(_iicDataCount!=-1)
{
if (timeout-- == 0)
{
return -1 ;
}
}

*data=_iicData[1];

return 0 ;
}



void __irq IicInt(void)
{
UINT32 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 READ_DATA:
if((_iicDataCount--)==0)
{
_iicData[_iicPt++]=rIICDS;

rIICSTAT=0x90; //stop MasRx condition --> IIC-bus STOP signal generation
rIICCON=0xaf; //resumes IIC operation. --> Clear pending condition
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 NOACK.
}
else
{
rIICCON=0xaf; //resumes IIC operation with ACK
}
break;

case WRITE_DATA:
if((_iicDataCount--)==0)
{
rIICSTAT=0xd0; //stop MasTx condition --> IIC-bus STOP signal generation
rIICCON=0xaf; //resumes IIC operation. --> Clear pending condition
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<10;i++); //for setup time until rising edge of IICSCL

rIICCON=0xaf; //resumes IIC operation.
break;

case SETRDADDR:
//printf("[S%d]",_iicDataCount);
if((_iicDataCount--)==0)
{
break; //IIC operation is stopped because of IICCON[4]
}

rIICDS=_iicData[_iicPt++];

for(i=0;i<10;i++); //for setup time until rising edge of IICSCL

rIICCON=0xaf; //resumes IIC operation.
break;

default:
break;
}
}
...全文

相关推荐

S3C44B0X启动代码分析

 44binit.s引导程序注解 GET option.s ;相当于c语言中的#include "option.s" GET memcfg.s ;Interrupt Control ;声明一些符号常量,这些符号常量和地址相应寄存器的地址对应 INTPND EQU 0x01e00004 ;指示中断请求状态寄存器,每一位代表一种中断请求,具体表示哪一种中断请参考44b0 spec IN

chybhsh

深入理解S3C44B0X开发板及ARM7TDMI架构

ARM架构以其低能耗和高效性能,在移动计算和嵌入式系统领域广泛采用。本章节将深入探讨ARM架构的核心特点和设计理念,以及S3C44B0X微处理器在这一架构下的角色和功能。S3C44B0X是一款基于ARM7TDMI核心的32位RISC微处理器,广泛应用于教育和消费电子产品。我们将会探讨其在ARM架构中的地位,以及它提供的丰富外设和接口对开发人员的意义。S3C44B0X不仅在性能上有所突破,在集成外设接口方面也具有相当的先进性。常见的外设接口包括:USB主机和设备接口。

觉昧

29Linux基础命令详解——用户管理.docx

29Linux基础命令详解——用户管理

云计算练习生

科技服务机构如何通过数据分析增强服务竞争力?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

vue+springboot基于 Java 的南昌实利广告公司的员工管理系统的设计与实现_oj680rl3毕业设计源码数据库.zip

vue+springboot基于 Java 的南昌实利广告公司的员工管理系统的设计与实现_oj680rl3毕业设计源码数据库.zip

源码论文专家
评论 18
收藏 已收藏
分享
返回顶部
yourtse
驱动开发/核心开发 21,620 成员 21,709 内容