打印
[PIC®/AVR®/dsPIC®产品]

PIC16F877A硬件I2C访问AT24C512

[复制链接]
1436|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pic16877a 硬件I2C写AT24C512时,发送起始信号,然后发送器件寻址,但24C512没有返回应答位,不知道是怎么回事?

上面黄色的波形是SCL,下面蓝色的是SDA,在SCL第九个波形时,SDA应该被24C512拉低为低电平,但现在没有拉低的

QQ截图20131228100423.jpg (18.93 KB )

波形

波形
沙发
chenbo360370864|  楼主 | 2013-12-28 10:09 | 只看该作者
#include<pic.h>
__CONFIG(0x3b31);

/*************************************************
函数功能:延时1MS  4MHz
函数输入: n 1MS延时的整数倍
函数返回:
*************************************************/
void delay_1ms(unsigned int n)
{
        unsigned int j;
        unsigned char i;
        for(j=0;j<n;j++)
                for(i=0;i<110;i++)
                        NOP();
}
/*************************************************
函数功能:延时微秒
函数输入:
函数返回:
*************************************************/
void delay_us(void)
{
        NOP();
        NOP();
}
/*************************************************
函数功能:初始化
函数输入:
函数返回:
*************************************************/
void init(void)
{
        TRISC =0b00011000;                        //SCL,SDA设置为输入
       
        SSPCON =0b00101000;                        //设置I2C主模式
        SSPCON2 =0b00000000;
        //波特率=Fosc/(4*(SSPADD+1))=>SSPADD+1=(Fosc/Band Rate)/4
        SSPADD =0x09;                                //当主频为4MHz时波特率为100kbps

        CKE=0;                                                //使用I2C协议规范电平
        SMP=1;                                                //关闭斜率控制
       
//        SSPIF=0;                                        //入使用SSPIF作为信号发送状态位则需要清空此位
//        BCLIF=0;                                        //清空总线冲突标志位
}

/*************************************************
函数功能:主机发送起始信号
函数输入:
函数返回:
*************************************************/
void I2C_Start(void)
{
        SEN=1;                                                //SEN置1使硬件发送起始信号
                                                                //发送完毕后硬件自动把SEN清零       
        while(SEN)                                        //SEN=1说明正在发送中
                ;                                                //循环结束说明SEN=0,即起始信号发送完毕
}
/*************************************************
函数功能:主机发送重新起动信号
函数输入:
函数返回:
*************************************************/
void I2C_RptStart(void)
{
        RSEN=1;                                                //RSEN置1使硬件发送重启信号
        while(RSEN)                                        //RSEN=1说明正在发送中
                ;                                                //循环结束说明RSEN=0,即重启信号发送完毕
}
/*************************************************
函数功能:主机发送停止信号
函数输入:
函数返回:
*************************************************/
void I2C_Stop(void)
{
        PEN=1;                                                //PEN置1使硬件发送停止信号
        while(PEN)                                        //PEN=1说明正在发送中
                ;                                                //循环结束说明PEN=0,即停止信号发送完毕
}

/*************************************************
函数功能:主机发送一位数据
函数输入: cData  待发送的数据
函数返回:
*************************************************/
void I2C_Write_Byte(unsigned char cData)
{
        SSPBUF =cData;                                //
        while(RW==1);                                        //主动模式下,判断发送是否完成
        while(SSPIF==0);
        while(ACKSTAT==1);                                //等待从机发送应答信号
}
/*************************************************
函数功能:主机向AT24C512写一个字节
函数输入: dat dat 待发送的数据
函数返回:
*************************************************/
void I2C_Write_AT24C512_Byte(unsigned char dat)
{
        I2C_Start();
        delay_us();
        I2C_Write_Byte(0XA0);                //向AT24C512发送写命令
        I2C_Write_Byte(0x00);                //向AT24C512发送待写入数据的地址
        I2C_Write_Byte(0x00);                //必须先发高8位地址,再发低8位地址
        I2C_Write_Byte(dat);                //对地址写入数据
        I2C_Stop();                                        //发送停止位
        delay_1ms(10);
}

void main(void)
{
        TRISB=0X00;
       
        PORTB =0x00;
       
        init();
        delay_1ms(100);

        I2C_Write_AT24C512_Byte(0xaa);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝