打印
[STM8]

我的STM8S访问HT1381(DS1302兼容)有问题.用的是模拟IO,请教版主.

[复制链接]
4921|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dami|  楼主 | 2008-12-10 22:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序贴下来.
头文件:
#define PCPORT         (GPIOC)
#define DS7_SCLK  (GPIO_PIN_3) //DS1302时钟
#define DS6_IO    (GPIO_PIN_7) // DS1302 数据
#define PGPORT         (GPIOG)
#define DS5_RST   (GPIO_PIN_0) //DS1302片选/复位

MAIN文件:

#include "stm8_lib.h"
#include "mycommon.h"
u8 Settimebuf[7],Gettimebuf[7];
void Delay (u16 nCount);
void Delay(u16 nCount)
{
  while (nCount != 0)
  {
    nCount--;
  }
}

void init(void)
{
    GPIO_Init_TypeDef GPIO_InitStructure;
         GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP_LOW_SLOW;
    GPIO_InitStructure.GPIO_Pin = (DS7_SCLK);
         GPIO_Init(PCPORT, &GPIO_InitStructure);
     
    GPIO_InitStructure.GPIO_Mode=GPIO_MODE_OUT_OD_LOW_FAST;//GPI         O_MODE_OUT_OD_HIZ_FAST ;
    GPIO_InitStructure.GPIO_Pin = (DS6_IO);
         GPIO_Init(PCPORT, &GPIO_InitStructure);
     
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP_LOW_SLOW;
    GPIO_InitStructure.GPIO_Pin = (DS5_RST);
         GPIO_Init(PGPORT, &GPIO_InitStructure);
     
//----------------------------------------------------------------
//HT1381
//----------------------------------------------------------------

void W8bit_HT1381(u8 wrdata)
{
    u8 i;
  for(i=0; i<8; i++)
  {
        if(wrdata&0x01){GPIO_WriteHigh(PCPORT,DS6_IO );}
        else{GPIO_WriteLow(PCPORT,DS6_IO );}
        Delay(5); 
        GPIO_WriteHigh(PCPORT,DS7_SCLK);        
      Delay(5); 
        GPIO_WriteLow(PCPORT,DS7_SCLK);
        Delay(5); 
        wrdata >> 1; 
  }
}
u8 R8bit_HT1381(void)
{
    u8 i,rddata;
    GPIO_WriteHigh(PCPORT,DS6_IO );
  for(i=0; i<8; i++)
  {
        rddata >>=1; 
        Delay(5); 
        if ((GPIO_ReadInputData(PCPORT) & DS6_IO) != (u8)0x00)
        { rddata |=0x80; }
        GPIO_WriteHigh(PCPORT,DS7_SCLK);        
      Delay(5); 
        GPIO_WriteLow(PCPORT,DS7_SCLK);
        Delay(5); 
        
  } 
  return(rddata); 
}
void Write1381(u8 Addr, u8 Wdata)
{
    GPIO_WriteLow(PGPORT,DS5_RST);
    Delay(5); 
    GPIO_WriteLow(PCPORT,DS7_SCLK);
    Delay(5); 
    GPIO_WriteHigh(PGPORT,DS5_RST);
    W8bit_HT1381(Addr);
    W8bit_HT1381(Wdata);
    GPIO_WriteHigh(PCPORT,DS7_SCLK);
    Delay(5); 
    GPIO_WriteLow(PCPORT,DS7_SCLK);
    Delay(5); 
    GPIO_WriteLow(PGPORT,DS5_RST);

u8 Read1381(u8 Addr)
{
    u8 rddata;
    GPIO_WriteLow(PGPORT,DS5_RST);
    Delay(5); 
    GPIO_WriteLow(PCPORT,DS7_SCLK);
    Delay(5); 
    GPIO_WriteHigh(PGPORT,DS5_RST);
    Delay(5); 
    W8bit_HT1381(Addr);
    rddata = R8bit_HT1381();
    Delay(5); 
    GPIO_WriteHigh(PCPORT,DS7_SCLK);        
    Delay(5); 
    GPIO_WriteLow(PCPORT,DS7_SCLK);
    Delay(5); 
    GPIO_WriteLow(PGPORT,DS5_RST);
  return(rddata);
}

void Set1381(u8 *pSecDa) 
{
    u8 i;
    u8 Addr = 0x80; 
    Write1381(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
    for(i =7;i>0;i--)
    { 
        Write1381(Addr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

        pSecDa++;
        Addr +=2;
    }
    Write1381(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/******************************************************************** 
*
* 名称: v_Get1381
* 说明: 
* 功能: 读取HT1381当前时间
* 调用: uc_R1381() 
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void Get1381(void) 
{
    u8 i;
    u8 Addr = 0x81;
    for (i=0;i<7;i++)
    {
        Gettimebuf = Read1381(Addr);/*格式为: 秒 分 时 日 月 
        星期 年 */
        Addr += 2;
    }


//----------------------------------------------------------------
void main(void)
{
    u8 i;
    u8 *pText;
    init();
    
    Delay(0xFFFF);
    Delay(0xFFFF);
    Gettimebuf[6] = 0x0; //年
    Gettimebuf[5] = 0x0; //周
    Gettimebuf[4] = 0x0; //月
    Gettimebuf[3] = 0x0; //日
    Gettimebuf[2] = 0x0; //时
    Gettimebuf[1] = 0x0; //分
    Gettimebuf[0] = 0x30;//秒
    Settimebuf[6] = 0x08; //年
    Settimebuf[5] = 0x01; //周
    Settimebuf[4] = 0x12; //月
    Settimebuf[3] = 0x08; //日
    Settimebuf[2] = 0x21; //时
    Settimebuf[1] = 0x29; //分
    Settimebuf[0] = 0x30;//秒
    Set1381(Settimebuf);
    while (1)
    {
    Get1381();
    }
  
}

/**
  * @brief Reports the name of the source file and the source line number where
  * the assert error has occurred.
  * User can add his own implementation to report the file name and line number.
  * ex: printf("Wrong parameters value: file %s on line %d ", file, line)
  * @retval void None
  * @par Required preconditions:
  * None
  * @par Called functions:
  * None
  */
#ifdef FULL_ASSERT
void assert_failed(u8 *file, u16 line)
#else
void assert_failed(void)
#endif
{
  /* Put enter your own code to manage an assert error */
}

/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
沙发
dami|  楼主 | 2008-12-10 22:48 | 只看该作者

读出来全是FF

使用特权

评论回复
板凳
席君秋| | 2008-12-11 00:23 | 只看该作者

请问楼主,哪里搞来的STM8S芯片??

使用特权

评论回复
地板
dami|  楼主 | 2008-12-11 09:01 | 只看该作者

ST搞来的啊.还能哪里,怎不能造假吧.

使用特权

评论回复
5
香水城| | 2008-12-11 10:14 | 只看该作者

你用示波器看看,到哪一步出现问题?

在下面这个帖子的问题解决了吗?好像这是2个相同的问题:STM8S的GPIO如何做成双向IO,如访问DS1302等,或模拟I2C?版主指点

使用特权

评论回复
6
dami|  楼主 | 2008-12-11 18:58 | 只看该作者

读不出数据 数据IO线DS6_IO老是高电平.

读不出数据 数据IO线DS6_IO老是高电平.
我把读命令发出去后应该回应读到的数据时DS6_IO老是高电平.没反应.
我的上拉电阻是51K

使用特权

评论回复
7
香水城| | 2008-12-11 19:03 | 只看该作者

如果硬件没有接错的话,应该是你的命令格式不对

另外,如果上拉到5V,请使用3~5K的上拉;如果上拉到3.3V,请使用2~3K的上拉。

使用特权

评论回复
8
dami|  楼主 | 2008-12-11 21:10 | 只看该作者

问题找到了.

好了.wrdata >> 1; 
要改成wrdata >>= 1;犯了很多次这个错误了.
程序其他方面没问题.

使用特权

评论回复
9
shu_007| | 2011-10-6 20:56 | 只看该作者
:(123456789

使用特权

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

本版积分规则

61

主题

1050

帖子

6

粉丝