共2条
1/1 1 跳转至页
ARM,I2C 那位ARM高手给看一下我的I2C驱动程序
问
/* ----------------------------------------------------------------
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;
}
如何把它改成ARM的I2C驱动
答 1: <有偿征求>把它改成ARM的I2C驱动/* ----------------------------------------------------------------
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;
}
如何把它改成ARM的I2C驱动
答 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: 你有时间吗?能帮我实现这个课题吗?
如果可以我可以适当补偿你。
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;
}
如何把它改成ARM的I2C驱动
答 1: <有偿征求>把它改成ARM的I2C驱动/* ----------------------------------------------------------------
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;
}
如何把它改成ARM的I2C驱动
答 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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |