您的位置 首页 开关

经过MSP430的IO口模仿I2C总线对AT24C25进行读写程序

再通过微处理器IO口模拟I2C总线对AT24C进行读写之前应注意一下两个问题:一、微处理器的两个模拟IO口在和SDA,SCL连接时必须使用上拉电阻

再经过微处理器I/O口模仿I2C总线对AT24C进行读写之前应留意一下两个问题:

一、微处理器的两个模仿I/O口在和SDA,SCL衔接时有必要运用上拉电阻。

一、I2C总线闲暇的时分,两条信号线应该保持高电平。不然,上拉电阻上会有耗电。特别是在上电过程中,I/O线上电平也应保持在高电平状况。也就是说:当Master的I2C运用的是I/O软件模仿时,一定要确保该两个I/O上电默许均为输入(或高阻)或许输出高电平,切不可默许为输出低电平。I/O默许为输入时,能够经过外部上拉电阻将I2C信号线拉至高电平。

该程序经过调试,能够直接使用,程序如下:

文 件 名 : AT24C256.S43.C

* 功用描绘 : I/O模仿I2C时序读写AT24CXX(支撑字节写、页写、字节读、次序读)
* 作 者 : 梦回大唐

* 创立日期 : 2011-4-18

* 版 本 : Version1.0
*************************************************************************************************/

#include
#define SDA_INP5DIR &=~BIT0// P5.0 IN
#define SDA_OUTP5DIR |=BIT0// P5.0 OUT

#define SDA_LOWP5OUT &=~BIT0// sda=0
#define SDA_HIGHP5OUT |=BIT0// sda=1

#define SCL_INP5DIR &=~BIT1// P5.1 IN
#define SCL_OUTP5DIR |=BIT1// P5.1 OUT

#define SCL_LOWP5OUT &=~BIT1
#define SCL_HIGHP5OUT |=BIT1
#defineW_EEPROM_LENGH14

#defineTURE1
#defineFALSE0
#defineAckError0x55
#defineOutOfRang0xaa
#defineOutOfAddr0xbb

unsigned chardat[W_EEPROM_LENGH]={1,2,3,4,5,6,7,8,9,10,11,12,13,14};
unsigned charx[W_EEPROM_LENGH];

void i2c_delay(unsigned char us);
void i2c_delay_ms(unsigned char ms);
void i2c_start();
void i2c_stop(void);
void i2c_SendAck(void);
void i2c_SendNoAck(void);
unsigned char i2c_check_ACK(void);
void i2c_SendByte(unsigned char data);
unsigned char i2c_RevByte(void);
unsigned char EEPROM_ByteWrite(unsigned int addr,unsigned char data);
unsigned char EEPROM_RandomRead(unsigned int addr);
unsigned char EEPROM_SequentialRead(unsigned int addr,unsigned int n,unsigned char* p);
unsigned int EEPROM_PageWrite(unsigned int page,unsigned char* p,unsigned char n);

void i2c_delay(unsigned char us)
{
unsigned char tmp;
while(us–)
{
for(tmp=0;tmp<4;tmp++)
{
_NOP();
}
}
}

void i2c_delay_ms(unsigned char ms)
{
unsigned int tmp;
while(ms–)
{
for(tmp=0;tmp<5000;tmp++)
{
_NOP();
}
}

}

void i2c_start(void)
{
SDA_OUT;
i2c_delay(20);
SDA_HIGH;
i2c_delay(3);
SCL_HIGH;
i2c_delay(2);
SDA_LOW;
i2c_delay(5);
SCL_LOW;
i2c_delay(10);
}

void i2c_stop(void)
{
SDA_OUT;
SDA_LOW;
i2c_delay(2);
SCL_HIGH;
i2c_delay(2);
SDA_LOW;
i2c_delay(2);
SDA_HIGH;
}

void i2c_SendAck(void)
{
SDA_OUT;
SDA_LOW;
i2c_delay(2);
SCL_LOW;
i2c_delay(2);
SCL_HIGH;
i2c_delay(2);
SCL_LOW;
SDA_HIGH;
}

void i2c_SendNoAck(void)
{
SDA_OUT;
SDA_HIGH;
i2c_delay(2);
SCL_LOW;
i2c_delay(2);
SCL_HIGH;
i2c_delay(2);
SCL_LOW;
}

unsigned char i2c_check_ACK(void)
{
unsigned char AckStatus;
SDA_IN;
SCL_HIGH;
i2c_delay(2);
if(P5IN & 0x01)
{
AckStatus = FALSE;
}
else
{
AckStatus = TURE;
}
SCL_LOW;
i2c_delay(2);
SDA_OUT;
return AckStatus;
}

void i2c_SendByte(unsigned char data)
{
unsigned char tmp;
SDA_OUT;
for(tmp=0;tmp<8;tmp++)
{
if(data & 0x80)
{
SDA_HIGH;
}
else
{
SDA_LOW;
}
i2c_delay(2);
SCL_HIGH;
i2c_delay(2);
SCL_LOW;
i2c_delay(2);
data <<= 1;
}
i2c_delay(15);
}

unsigned char i2c_RevByte(void)
{
unsigned char tmp;
unsigned char DATA=0;
SDA_IN;
SCL_LOW;
i2c_delay(2);
for(tmp=0;tmp<8;tmp++)
{
SCL_HIGH;
i2c_delay(2);
DATA <<= 1;
if(P5IN & 0x01)
{
DATA |= 0x01;
}
else
{
DATA &= 0xfe;
}
SCL_LOW;
}
SDA_OUT;
return DATA;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/257441.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部