OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ARM,I2C 那位ARM高手给看一下我的I2C驱动程序

共2条 1/1 1 跳转至

ARM,I2C 那位ARM高手给看一下我的I2C驱动程序

院士
2006-12-22 22:43:00    评分
ARM,I2C 那位ARM高手给看一下我的I2C驱动程序



关键词: 那位     高手     看一下     我的     驱动程序    

院士
2006-12-22 22:43:00    评分
2楼
问 /* ----------------------------------------------------------------
I2C总线
1、起始位:SCL=1时,在SDA上有下降延
2、停止位:SCL=1时,在SDA上有上升延
*主器件发停止信号给从器件,作用在于使从器件处为准备
状态(或是已知的状态)
3、从应答:SDA=0(写数据时用)
应答的器件在第九个时钟周期将SDA线拉低,表示已收到一
个8位数据,并表示可继续接收
*用途:主机向从机写一字节后接收从应答,再进行后续操
作(一般不考虑从应答位的具体值,
仅在应答检测其值才有意义:判断从器件是否完成内部写周期)
4、主应答:SDA=0(读数据时用)
主机每接收从机一字节数据(不是最后一个)时,返回一个应答位ACK
无需应答:SDA=1(读数据时用)
主机接收从机传送的(最后一个字节)时,返回应答位NO_ACK
*用途:当从机工作于读模式时,在发送一个8位数据后释放SDA线并?
监视一个应答信号;一旦接收到应答信号,从机继续发送数据;
如主器件没有发送应答信号器件,从机停止
*传送数据并等待一个停止信号,主器件必须发一个停止信号给从
机使其进入备用电源模式并
使器件处于已知的状态
5、应答检测:采用应答检测读命令测试是否<页写>结束(通过从应答来识别)
*当从器件完成内部写周期后将发送一个应答信号给主器件,以便
可以继续进行下一次读写操作
6、对E2PROM来说:从器件地址的前四位是固定的“1010”
—————————————————————*/
#ifndef SDA
#define SDA P0_0
#define SCL P0_1
#endif

extern uchar SystemError;

#define uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int
#define bool bit
#define true 1
#define false 0

#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();

/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void)
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//INI
SDA=0; SomeNOP(); //START
SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void)
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //INI
SCL=1; SomeNOP(); SDA=1; //STOP
EA=1;
}
/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void)
?等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bool WaitAck(void)
{
uchar errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;SomeNOP();
SCL=1;SomeNOP();
while(SDA) {errtime--; if (!errtime) {I2CStop();SystemError=0x11;return false;}}
SCL=0;
return true;

文件: PCF8563T.C 2001-11-27, 18:39:20
}

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ,主器件为接收方,从器件为发送方时,非应答信号。
}**--------------------------------------------------------------------------------
void SendNotAck(void)
{
SDA=1; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch)
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
uchar i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
SCL=1; SomeNOP();
}
SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void)
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
uchar i=8;
Byte ddata=0;
SDA=1;
while (i--)
{
ddata<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP();
ddata|=SDA;
}
SCL=0;
return ddata;
}

如何把它改成ARMI2C驱动
1: <有偿征求>把它改成ARMI2C驱动/* ----------------------------------------------------------------
I2C总线
1、起始位:SCL=1时,在SDA上有下降延
2、停止位:SCL=1时,在SDA上有上升延
*主器件发停止信号给从器件,作用在于使从器件处为准备
状态(或是已知的状态)
3、从应答:SDA=0(写数据时用)
应答的器件在第九个时钟周期将SDA线拉低,表示已收到一
个8位数据,并表示可继续接收
*用途:主机向从机写一字节后接收从应答,再进行后续操
作(一般不考虑从应答位的具体值,
仅在应答检测其值才有意义:判断从器件是否完成内部写周期)
4、主应答:SDA=0(读数据时用)
主机每接收从机一字节数据(不是最后一个)时,返回一个应答位ACK
无需应答:SDA=1(读数据时用)
主机接收从机传送的(最后一个字节)时,返回应答位NO_ACK
*用途:当从机工作于读模式时,在发送一个8位数据后释放SDA线并?
监视一个应答信号;一旦接收到应答信号,从机继续发送数据;
如主器件没有发送应答信号器件,从机停止
*传送数据并等待一个停止信号,主器件必须发一个停止信号给从
机使其进入备用电源模式并
使器件处于已知的状态
5、应答检测:采用应答检测读命令测试是否<页写>结束(通过从应答来识别)
*当从器件完成内部写周期后将发送一个应答信号给主器件,以便
可以继续进行下一次读写操作
6、对E2PROM来说:从器件地址的前四位是固定的“1010”
—————————————————————*/
#ifndef SDA
#define SDA P0_0
#define SCL P0_1
#endif

extern uchar SystemError;

#define uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int
#define bool bit
#define true 1
#define false 0

#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();

/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void)
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//INI
SDA=0; SomeNOP(); //START
SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void)
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //INI
SCL=1; SomeNOP(); SDA=1; //STOP
EA=1;
}
/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void)
?等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bool WaitAck(void)
{
uchar errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;SomeNOP();
SCL=1;SomeNOP();
while(SDA) {errtime--; if (!errtime) {I2CStop();SystemError=0x11;return false;}}
SCL=0;
return true;

文件: PCF8563T.C 2001-11-27, 18:39:20
}

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ,主器件为接收方,从器件为发送方时,非应答信号。
}**--------------------------------------------------------------------------------
void SendNotAck(void)
{
SDA=1; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch)
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
uchar i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
SCL=1; SomeNOP();
}
SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void)
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
uchar i=8;
Byte ddata=0;
SDA=1;
while (i--)
{
ddata<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP();
ddata|=SDA;
}
SCL=0;
return ddata;
}

如何把它改成ARMI2C驱动

2: ARM是集成i2c的一般51上的是模拟的,ARM上用模拟就浪费了集成i2c 3: 完全不用这么麻烦~同意楼上的~
硬件的iic只要配置寄存其就行,比模拟的简单多了~ 4: 那ARM 上就集成有I2C 5: 那如何配置寄存器? 6: 看你用的什么型号了~具体查芯片资料~ 7: EP9315 8: 能不能帮我实现这个题目我急用 9: 呵呵,看了一下,好像没有硬件iic到是有三个iis接口,集成度比一般的ARM要高,看来是用在一些具体的应用中.

不清楚iis是不是可以用来当做iic来用,实在不行就用gpio来模拟吧~ 10: 我同学提出把两个INT端口设成外部可操作断口接eeprom可行不 ?eeprom是24c512 11: 明白你的意思了~你同学的意思就是用gpio模拟了,这样程序可能复杂一些.可以实现
如果硬件没有定型的话也可以选择spi接口的eeprom,看你那个ARM上有记录spi接口~ 12: iversonma能留下你的qq吗? 13: reqq:34077386
不过现在上不了~~
mail:iversonma@sina.com.cn 14: 我必须用 15: 我必须用 EP9315 16: 可以更换eeprom用spi接口的flash亚~

eeprom是24c512 17: 你有时间吗?能帮我实现这个课题吗?
如果可以我可以适当补偿你。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]