因此,我目前正在尝试读写时间到RTC,这些方法将无法工作。
这就是我所拥有的:
因此,它发送地址字节以确定要从哪里读取,然后将pin翻转到input并读取每个位,直到字节完成。

 char ReadByte(char ByteToRead)
 {
    RB0 = 0; // ensure CLK low
    RB5 = 1;
    char received = 0;
    int i;

    for(i =0;i < 8 ;i++)
    {
        RB4 = ByteToRead & 1;
        RB0 = 0;
        ByteToRead >>= 1;
        RB0 = 1;

    }
    TRISB4 = 1;//B4 = input port

    for(i =0;i < 8 ;i++)
    {
        received |= RB4;
        RB0 = 1;
        received <<= 1;
        RB0 = 0;
    }

    RB5=0;

    TRISB4 = 0;

    return DecimalToBCD(received);
}

第二个例子是我的写作方法:
void WriteByte(char ClockReg ,char data)

{
    RB0 = 0; // ensure CLK low
    RB5 = 1; // raises RST bit
    int i;
    for(i =0;i < 8 ;i++)
    {
        RB4 = ClockReg & 1;
        RB0 = 0;
        ClockReg >>= 1;
        RB0 = 1;
    }

    for(i =0;i < 8 ;i++)
    {

        RB4 = data & 1;
        RB0 = 0;
        data >>= 1;
        RB0 = 1;

    }
    RB5 = 0;
    __delay_us(1);
    RB5 = 1;
}

这对第一个位也一样,以确定寄存器写入你给它的值。
我在网上能找到的唯一帮助是一个2年前的网页的链接,那里没有代码,或者只是帮助那些要求PMed的人。所以请你帮忙
提前谢谢

最佳答案

在您处理WriteByte之前,我先处理ReadByte方法,因为这样您就可以通过读取它来验证写操作。所以,看一下ReadByte例程,我可以很快看到一个问题。
DS1302的数据表上写着“数据位在时钟的下降沿上输出”,但在ReadByte例程中,读取RB4上的输入,然后将时钟设置为低。另外“注意,要传输的第一个数据位发生在写入命令字节的最后一位之后的第一个下降沿上。”但是第一次通过循环时,您是在第一个下降沿之前读取RB4的。

10-08 06:38