STM32使用模拟IIC操作EEPROM
总线钳住,下一个时间SDA可以输出高低电平。
Delay_us(4);
}
//////////////////////////////////////////////////////////////////////////
// 函数名 : IIC_Stop
// 功能 : i2c结束信号
// 参数 : void
// 作者 : wit_yuan
// 时间 : 2014-11-07
////////////////////////////////////////////////////////////////////////////
void IIC_Stop(void)
{
SDA_OUT();
IIC_SDA=0; //上一个状态的SCL=0,这个状态设置SDA=0,目的是让状态能反转
Delay_us(2);
IIC_SCL=1; //该时刻设置SCL=1,然后就可以让数据稳定在改状态下。
Delay_us(2);
IIC_SDA=1;
Delay_us(4);
}
//////////////////////////////////////////////////////////////////////////
// 函数名 : IIC_Wait_Ack
// 功能 : 等待i2c的应答信号
// 参数 : void
// 作者 : wit_yuan
// 时间 : 2014-11-07
////////////////////////////////////////////////////////////////////////////
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u16 ucErrTime=0;
IIC_SCL=0;
Delay_us(1);
SDA_IN(); //SDA设置为输入
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1; //超时,表明数据传输有问题
}
}
IIC_SCL=1;
Delay_us(1);
IIC_SCL=0;//时钟输出0
Delay_us(2);
return 0;
}
//////////////////////////////////////////////////////////////////////////
// 函数名 : IIC_Ack
// 功能 : 产生i2c的ack应答信号
// 参数 : void
// 作者 : wit_yuan
// 时间 : 2014-11-07
////////////////////////////////////////////////////////////////////////////
//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL=0;
Delay_us(2);
SDA_OUT();
IIC_SDA=0;
Delay_us(1);
IIC_SCL=1;
Delay_us(1);
IIC_SCL=0;
Delay_us(4);
}
//不产生ACK应答
void IIC_NAck(void)
{
SDA_OUT();
IIC_SCL=0;
Delay_us(2);
IIC_SDA=1;
Delay_us(2);
IIC_SCL=1;
Delay_us(2);
IIC_SCL=0;
Delay_us(2);
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低时钟开始数据传输
Delay_us(2);
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
IIC_SDA=1;
else
IIC_SDA=0;
txd<=1;
Delay_us(2);
IIC_SCL=1;
Delay_us(2);
IIC_SCL=0;
Delay_us(2);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
unsigned char IIC_Read_Byte( void )
{
unsigned char i,u_receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
IIC_SCL=0;
Delay_us(4);
IIC_SCL=1;
Delay_us(1);
u_receive<=1;
if(READ_SDA)
u_receive++;
}
return u_receive;
}
unsigned char eeprom_write(unsigned char c_slave_address7bit,unsigned char c_reg_address,unsigned char u_data)
{
unsigned char u_wait_err = 0;
IIC_Start();
IIC_Send_Byte(c_slave_address7bit < 1);
u_wait_err |= IIC_Wait_Ack();
IIC_Send_Byte(c_reg_address);
u_wait_err |= IIC_Wait_Ack();
IIC_Send_Byte(u_data);
u_wait_err |= IIC_Wait_Ack();
IIC_Stop();
if( u_wait_err == 0)
return 0;
return 1;
}
unsigned char eeprom_read(unsigned char c_slave_address7bit,unsigned char c_reg_address)
{
unsigned char u_temp;
unsigned char u_wait_err = 0;
IIC_Start();
IIC_Send_Byte(c_slave_address7bit < 1);
u_wait_err |= IIC_Wait_Ack();
IIC_Send_Byte(c_reg_address);
u_wait_err |= IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte((c_slave_address7bit < 1)+1);
u_wait_err |= IIC_Wait_Ack();
u_temp = IIC_Read_Byte( );
IIC_NAck();//不需要响应
IIC_Stop();
return u_temp;
}
unsigned char eeprom_continue_read(unsigned char c_slave_address7bit,unsigned char c_reg_address,
unsigned char c_continue_read_arr[],unsigned int len)
{
unsigned char u_wait_err = 0;
int i = 0;
IIC_Start();
IIC_Send_Byte(c_slave_address7bit < 1);
u_wait_err |= IIC_Wait_Ack();
IIC_Send_Byte(c_reg_address);
u_wait_err |= IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte((c_slave_address7bit < 1)+1);
u_wait_err |= IIC_Wait_Ack();
for(i = 0 ; i < len - 1 ; i ++)
{
c_continue_read_arr[i] = IIC_Read_Byte( );
IIC_Ack();
}
c_continue_read_arr[len-1] = IIC_Read_Byte( );
u_wait_err |= IIC_Wait_Ack();
IIC_Stop();
if(u_wait_err == 0)
return 0;
return 1;
}
//如果数据写入有问题,则返回1,表示错误,返回0,表示错误
unsigned char eeprom_continue_write(unsigned char c_slave_address7bit,unsigned char c_reg_address,
unsigned char c_continue_write_arr[],unsigned int len)
{
unsigned int i;
unsigned int i_err = 0;
IIC_Start();
IIC_Send_Byte(c_slave_address7bit < 1);
i_err |= IIC_Wait_Ack();
IIC_Send_Byte(c_reg_address);
i_err |= IIC_Wait_Ack();
for( i = 0 ; i < len ; i ++ )
{
IIC_Send_Byte(c_continue_write_arr[i]);
i_err |= IIC_Wait_Ack();
}
IIC_Stop();
if(i_err == 0)
return 0;
return 1;
}
STM32模拟IIC操作EEPRO 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)