#define SDA PORTA.1
#define SCL PORTA.0
#define RAMSDA_1 PORTA|=0X02 /*PA1*/
#define RAMSDA_0 PORTA&=~0X02
#define RAMSCL_1 PORTA|=0X01 /*PA0*/
#define RAMSCL_0 PORTA&=~0X01
#define RAMSDA_OUT DDRA|=0X02
#define RAMSDA_IN DDRA&=~0X02
#define RAMSDA_READ PINA&0X02
void IIC_Start(void)
{
RAMSDA_1;
// delay_us(200);
RAMSCL_1;
delay_us(200);
RAMSDA_0;
delay_us(200);
RAMSCL_0;
delay_us(200);
}
void IIC_Stop(void)
{
RAMSCL_0;
// delay_us(200);
RAMSDA_0;
delay_us(200);
RAMSCL_1;
delay_us(200);
RAMSDA_1;
delay_us(200);
}
void Wait_ACK()
{
uchar errtime=20;
RAMSDA_OUT;
RAMSDA_1;
delay_us(200);
RAMSDA_IN;
RAMSCL_1;
delay_us(200);
while((PINA&0X02)==0X02)
{
errtime--;
if(!errtime)
{
Usart_PutString("System Wrong!!!");
IIC_Stop();
}
}
RAMSCL_0;
delay_us(200);
RAMSDA_OUT;
}
void IIC_Write_Byte(uchar wdata)
{
uchar i;
for(i=0;i<8;i++)
{
if((wdata&0x80)==0x80)
{
RAMSDA_1;
}
else RAMSDA_0;
wdata<<1;
RAMSCL_1;
delay_us(200);
RAMSCL_0;
}
Wait_ACK();
}
void main(void)
{
Port_init(); /*端口初始化*/
IIC_init(); /*IIC通讯初始化*/
IIC_Write_Byte(write_ADD);
}
今天写PCF8563时钟芯片的程序,刚开始就单纯写一个字节,发现把引脚拉高后,芯片不会把SDA脚拉低,各位大侠有时间的话帮我看看程序吧,谢谢! |