1

所以我目前正在尝试读取和写入 RTC 的时间,而这些方法将不起作用。

这就是我所拥有的:所以它发送地址字节以确定它想从哪里读取,然后将引脚翻转到输入并读取每个位,直到字节完成。

 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);
}

第二个示例是我的 write 方法:

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 的人。所以请如果你能帮忙

提前致谢

4

2 回答 2

0

被证实!

我相信这是因为我还没有为未来的读者禁用写保护位,时钟停止标志 (CH) 将被清除而不设置。

希望这可以帮助任何寻找它的人丹

于 2012-12-07T15:34:11.570 回答
0

在你处理 WriteByte 之前,我会处理 ReadByte 方法,因为这样你就可以通过读回它来验证写入。因此,查看 ReadByte 例程,我可以很快发现一个问题。

DS1302 的数据表说“数据位在时钟的下降沿输出”,但在您的 ReadByte 例程中,读取 RB4 上的输入,然后将时钟设置为低电平。另外“请注意,要传输的第一个数据位发生在写入命令字节的最后一位之后的第一个下降沿。” 但是您第一次通过循环时,您在第一个下降沿之前读取 RB4。

于 2012-12-06T13:04:56.323 回答