用HT46L仿真器硬件仿真HT46R24驱动合泰时钟芯片HT1381存在的问题是读不出偶数时间。
仿真HT46R24对HT1381的写入时间值和读奇数时间值是对的,而且时间是准确的,读出偶数时间要么全为0(无上拉电阻)要么全为0XFF(带上拉电阻)(连续读写和单独读写都是同样的问题)。主程序半分钟读一次时间。
用AVR系列的MCU来驱动HT1381就没有这些现象。就因这个问题整个专案被拖了。各位大侠解救一下小弟吧,谢谢。
详细HT46R24驱动HT1381程序如下
#define SCLK_HT1381_OUT
(_15_0 = 0)
#define I0_HT1381_OUT
(_15_2 = 0)
#define I0_HT1381_INPUT
(_15_2 = 1)
#define RST_HT1381_OUT
(_15_4 = 0)
#define SCLK_HT1381_L
(_pb0 = 0)
#define SCLK_HT1381_H
(_pb0 = 1)
#define I0_HT1381_L
(_pb2 = 0)
#define I0_HT1381_H
(_pb2 = 1)
#define RST_HT1381_L
(_pb4 =0 )
#define RST_HT1381_H
(_pb4 =1)
#define READ_I0_HT1380
(_pb2)
void Init_hardware_HT1381(void)
{
SCLK_HT1381_OUT;
I0_HT1381_OUT;
RST_HT1381_OUT;
}
void Write_Singlebyte_HT1381(unsigned char command, unsigned char xmtdat)
{
unsigned char i ;
i = 0;
I0_HT1381_OUT;//IO口设置为输出
RST_HT1381_L;//复位引脚为低电平所有数据传送终止
_nop();
_nop();
SCLK_HT1381_L;//清时钟总线
_nop();
_nop();
RST_HT1381_H;//复位引脚为高电平逻辑控制有效
_nop();
_nop();
//---------Write command----------------
for (i=8;i>0;i--)
{
if ((command&0x01)==1)
{
I0_HT1381_H;
}
else
{
I0_HT1381_L;
}
_nop();
SCLK_HT1381_H;//时钟上升沿发送数据有效
_nop();
_nop();
SCLK_HT1381_L;
command>>=1;
}
//--------Write data-------------------
for (i=8;i>0;i--)
{
if ((xmtdat&0x01)==1)
{
I0_HT1381_H;
}
else
{
I0_HT1381_L;
}
_nop();
SCLK_HT1381_H;//时钟上升沿发送数据有效
_nop();
_nop();
SCLK_HT1381_L;
xmtdat>>=1;
}
_nop();
RST_HT1381_L;//复位引脚为低电平所有数据传送终止
}
short int Read_Singlebyte_HT1381(unsigned char command)
{
unsigned char i ;
unsigned int data ;
i = 0;
data = 0;
I0_HT1381_OUT;//IO口为输出状态
_nop();
_nop();
_nop();
RST_HT1381_L;//复位引脚为低电平所有数据传送终止
_nop();
_nop();
SCLK_HT1381_L;//清时钟总线
_nop();
RST_HT1381_H;//复位引脚为高电平逻辑控制有效
_nop();
_nop();
//---------Write command----------------
for (i=8;i>0;i--)
{
if ((command&0x01)==0x01)
{
I0_HT1381_H;
}
else
{
I0_HT1381_L;
}
_nop();
SCLK_HT1381_H;//时钟上升沿发送数据有效
_nop();
_nop();
SCLK_HT1381_L;
command>>=1;
}
//---------Read Singlebyte----------------
_nop();
I0_HT1381_INPUT;//IO口为输入状态
for(i=8;i>0;i--)
{
data>>=1;
SCLK_HT1381_H;//时钟总线置高
if(READ_I0_HT1380==0)
{
data = (data&0x7f);
}
else
{
data = (data|0x80);
}
_nop();
_nop();
SCLK_HT1381_L;//时钟下降沿接收数据有效
_nop();
_nop();
}
RST_HT1381_L;//复位引脚为低电平所有数据传送终止
_nop();
_nop();
_nop();
return data;
}
void init_ht1381(void)
{
Init_hardware_HT1381();
Write_Singlebyte_HT1381(0x8e,0);
Write_Singlebyte_HT1381(0x80,0);
} |