高级会员

- 积分
- 579
- 金钱
- 579
- 注册时间
- 2019-8-4
- 在线时间
- 187 小时
|
10金钱
仿写的实验程序检测不到AT24C02芯片,请大神指教IIC程序
#include "myIIC.h"
#include "delay.h"
void IIC_Init (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_SetBits(GPIOB, GPIO_Pin_6| GPIO_Pin_7);
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void IIC_Start (void)
{
SDA_OUT();
IIC_SDA =1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;
delay_us(4);
IIC_SCL=0;
}
void IIC_Stop (void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA =0;
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);
}
void IIC_Ack (void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_NAck(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA =1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
u8 IIC_Wait_Ack (void)
{
u8 i=0;
SDA_IN();
IIC_SCL=1;delay_us(1);
IIC_SDA =1;delay_us(1);
while(READ_SDA)
{
i++;
if(i>250) { IIC_Stop(); return 1;}
}
IIC_SCL=0;
return 0;
}
void IIC_Send_Byte(u8 txd)
{
u8 i;
SDA_OUT();
for(i=0;i<8;i++)//低位开始
{
IIC_SCL=0;
IIC_SDA=(txd&0X80)>>7;
txd<<=1;delay_us(2);
IIC_SCL=1;delay_us(2);
IIC_SCL=0;delay_us(2);
}
}
u8 IIC_Read_Byte(unsigned char ack)
{
//u8 IIC_Read_Byte(unsigned char ack);
char i;
char receive=0;
SDA_IN();
for(i=0;i<8;i++)
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
if(READ_SDA)receive++;
receive<<=1;
delay_us(2);
}
if(ack) IIC_Ack();
else IIC_NAck();
return receive;
}
AT24C02程序
#include "24cxx.h"
#include "delay.h"
void AT24CXX_Init(void)
{
IIC_Init ();
}
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 Data)
{
IIC_Start();
if(EE_TYPE> AT24C16)
{
IIC_Send_Byte(0XA0);
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);
}
else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));//一个地址写八bit位
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr%256);
IIC_Wait_Ack();
IIC_Send_Byte(Data);
IIC_Wait_Ack();
IIC_Stop();
delay_us(10);
}
void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
{
u8 i;
for(i=0;i<Len;i++)
{
AT24CXX_WriteOneByte(WriteAddr+i,(DataToWrite>>(8*i))&0XFF);
}
}
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
char receive=0;
IIC_Start();
if(EE_TYPE> AT24C16)
{
IIC_Send_Byte(0XA0);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);
IIC_Wait_Ack();
}
else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1);
IIC_Wait_Ack();
receive=IIC_Read_Byte(0);
IIC_Stop();
return receive;
}
u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
{
u8 i;
u32 receive=0;
for(i=1;i<=Len;i++)
{
receive<<=8;
receive+=AT24CXX_ReadOneByte(ReadAddr+Len-i);
}
return receive;
}
u8 AT24CXX_Check(void)
{
u8 receive;
receive=AT24CXX_ReadOneByte(255);
if (receive==0X55) return 0;
else
{
AT24CXX_WriteOneByte(255,0X55);
receive=AT24CXX_ReadOneByte(255);
if (receive==0X55) return 0;
}
return 1;
}
void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
while(NumToRead)
{
*pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
NumToRead--;
}
}
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
while(NumToWrite--)
{
AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
pBuffer++;
WriteAddr++;
}
}
|
-
AT24C02检测不到
最佳答案
查看完整内容[请看2#楼]
已经知道了,这两行代码顺序倒一下,否则最高位会被移出去
if(READ_SDA)receive++;
receive
|