搜索
bottom↓
回复: 5

关于STM32驱动DS12C887的问题,驱动是改的,读写有问题

[复制链接]

出0入0汤圆

发表于 2012-7-15 13:16:21 | 显示全部楼层 |阅读模式
硬件的连接:
PE8~PE15对应的是DS12C887的AD0~AD7,PE7~R/W,PB1~DS,PB10~AS,PB11~CS,PB0~IRO,另外MOT~GND    VCC~5V,reset ~5v

初始化:
ds12c887_init();
  ds12c887_writereg(0x0a,0x2f);//启动887的震荡       
  ds12c887_writereg(0x0B,0x16);//0001 0110  选更新中断+二进制格式,每秒产生一次中断

我在WHILE里面看看到底驱动成功没有:TAB_887A[0]=ds12c887_readreg(0x02);,一直是0XFF,
下面是子程序函数:
void ds12c887_setoutput(uint16_t i)
{
   
    /*
   
   
   
   
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 |GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    */
  
  GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 |GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15 ;
   
    if(i)
    {
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    }
    else
    {
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;//GPIO_Mode_Out_PP;GPIO_Mode_IN_FLOATING
    }
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void ds12c887_delay(uint32_t us);

/*
void ds12c887_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;                       
ds12c887_setoutput(0);

GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_14 ;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

CS_DESELECT();
AS_DISABLE();
WR_DISABLE();
RD_DISABLE();

ds12c887_delay(100000l);
}

*/
void ds12c887_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;                       
    ds12c887_setoutput(0);  
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1  | GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    //ds12c887Z中断引脚说明,注意由于是漏极输出,所以必须上拉电阻输入
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    /*
   
   
   
   
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 |GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    */
    CS_DESELECT();
    AS_DISABLE();
    WR_DISABLE();
    RD_DISABLE();   
    ds12c887_delay(100000l);
}
void ds12c887_delay(uint32_t us)
{
    uint32_t i,j;
    for(j=0;j<us;j++)
    for(i=0;i<72;i++);
}

void ds12c887_writeadd(uint8_t add)
{
    u16 RTC_DATA_OUT = 0x0000 ;
    u16 RTC_DATA_OUT1 = 0x0000;
    ds12c887_setoutput(1);
    //DAT_OUTPUT(add);
    RTC_DATA_OUT = GPIO_ReadOutputData(GPIOE);
    RTC_DATA_OUT &=0x00FF;                                      
    RTC_DATA_OUT1 = (u16)(add)<<8;
    RTC_DATA_OUT |= RTC_DATA_OUT1;
    GPIO_Write(GPIOE, RTC_DATA_OUT);
   
   
   
    ds12c887_delay(10);
    AS_ENABLE();
    ds12c887_delay(10);
    AS_DISABLE();
    ds12c887_delay(10);
    ds12c887_setoutput(0);
}

void ds12c887_writedat(uint8_t dat)
{
    u16 RTC_DATA_OUT = 0x0000 ;
    u16 RTC_DATA_OUT1 = 0x0000;
    ds12c887_setoutput(1);
    //DAT_OUTPUT(dat);
    RTC_DATA_OUT = GPIO_ReadOutputData(GPIOE);
    RTC_DATA_OUT &=0x00FF;                                      
    RTC_DATA_OUT1 = (u16)(dat)<<8;
    RTC_DATA_OUT |= RTC_DATA_OUT1;
    GPIO_Write(GPIOE, RTC_DATA_OUT);
   
   
   
    ds12c887_delay(10);
    WR_ENABLE();
    ds12c887_delay(10);
    WR_DISABLE();
    ds12c887_delay(10);
    ds12c887_setoutput(0);
}


uint8_t ds12c887_readdat(void)
{
    uint8_t dat;
    ds12c887_setoutput(0);
   
    ds12c887_delay(10);
    RD_ENABLE();
    ds12c887_delay(10);
    //dat = DAT_INPUT();
    dat=(u8)((GPIOE->IDR)>>8);
    RD_DISABLE();
    ds12c887_delay(10);
    return dat;
}

void ds12c887_writereg(uint8_t add,uint8_t dat)
{
    CS_SELECT();
    ds12c887_delay(10);
    ds12c887_writeadd(add);
    ds12c887_writedat(dat);
    CS_DESELECT();
    ds12c887_delay(10);
}

uint8_t  ds12c887_readreg(uint8_t add)
{
    uint8_t dat;
    CS_SELECT();
    ds12c887_delay(10);
    ds12c887_writeadd(add);
    dat = ds12c887_readdat();
    CS_DESELECT();
    ds12c887_delay(10);
    return dat;
}



前辈们帮帮小弟,看看到底哪个环节出问题了,应该是我这个驱动程序的问题,硬件四块都试过了都不行,哎在线等,帮忙呀,江湖救急,好几天了

出0入0汤圆

 楼主| 发表于 2012-7-15 13:19:25 | 显示全部楼层
呜呜在线等,自己顶顶大哥们你们帮忙一下呀,小弟拜谢了,暑假同学都回家了,自己在实验室搞这个,搞的心烦着急呜呜,搞完了再回家

出0入0汤圆

 楼主| 发表于 2012-7-15 13:20:15 | 显示全部楼层
呜呜在线等,自己顶顶大哥们你们帮忙一下呀,小弟拜谢了,暑假同学都回家了,自己在实验室搞这个,搞的心烦着急呜呜,搞完了再回家

出0入0汤圆

 楼主| 发表于 2012-7-15 14:14:50 | 显示全部楼层
哎在线等前辈们

出0入0汤圆

 楼主| 发表于 2012-7-15 15:54:31 | 显示全部楼层
光又看的,没人帮帮忙呀

出0入0汤圆

发表于 2022-9-8 09:28:11 | 显示全部楼层
电平不匹配导致的吧,12C887是5V,ST单片机是3.3V。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 09:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表