?? ds1620.c
字號:
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "ds1620.h"
#define DS1620_READ_TEMPERATURE 0xAA
#define DS1620_READ_COUNTER 0xA0
#define DS1620_READ_SLOPE 0xA9
#define DS1620_START_CONVERT_T 0xEE
#define DS1620_STOP_CONVERT_T 0x22
#define DS1620_WRITE_TH 0x01
#define DS1620_WRITE_TL 0x02
#define DS1620_READ_TH 0xA1
#define DS1620_READ_TL 0xA2
#define DS1620_WRITE_CONFIG 0x0C
#define DS1620_READ_CONFIG 0xAC
#define DS1620_DELAY_COUNT 0x50
#define DS1620_CONFIG 0x08
static void delay1620(void);
static USHORT read1620(Ds1620CfgStruct *pCfg,UCHAR byBits);
static void write1620(Ds1620CfgStruct *pCfg,USHORT wCode, UCHAR byBits);
static void access1620(Ds1620CfgStruct *pCfg,UCHAR byInstuction,
USHORT wPara, USHORT *wRtnValue);
#define Ds1620Dat_Tmp(tmp) (((tmp)<0x100)?((tmp)/2):(((tmp)&0xff-0x100)/2))
#define Ds1620Tmp_Dat(tmp) (((tmp)>0)?(((USHORT)((tmp)*2))&0xff):(0x1ff-(((USHORT)(-(tmp)*2))&0xff)));
static void Ds1620Init(void *pDataBuf, Ds1620CfgStruct *cfg )
{
USHORT temp_ushort;
Ds1620CfgStruct* pCfg =(Ds1620CfgStruct *)(pDataBuf);
/*-------------------------<< Initial data >>-------------------------------*/
memmove(pCfg,cfg,sizeof(*cfg));
SetLLDat(&pCfg->Clk,1); /* 上電時序配置,保證1620處于stand-alone模式 */
delay1620();
SetLLDat(&pCfg->Clk,0);
access1620(pCfg,DS1620_READ_CONFIG, 0, &temp_ushort);
if ((temp_ushort & 0x3 )!=( DS1620_CONFIG&0x3))
access1620(pCfg,DS1620_WRITE_CONFIG, DS1620_CONFIG, NULL);
access1620(pCfg,DS1620_START_CONVERT_T, 0, NULL);
}
static int Ds1620Read(void *pDataBuf,void *pBuf, int MaxLen)
{
USHORT temp_ushort;
Ds1620CfgStruct *pCfg;
if(MaxLen < sizeof(int))return SDE_INVALID_ARG;
pCfg=(Ds1620CfgStruct *)pDataBuf;
access1620(pCfg,DS1620_READ_TEMPERATURE, 0, &temp_ushort);
/* 讀到的溫度值是實際溫度的2倍 */
*(int *)pBuf=Ds1620Dat_Tmp(temp_ushort);
return SDE_OK;
}
static int Ds1620Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
int ret;
USHORT temp_ushort;
/* PDA *pda= (PDA *)(GetIMMR() & IO_MAP_MASK); */
Ds1620CfgStruct* pCfg =(Ds1620CfgStruct *)(pDataBuf);
switch(cmd)
{
case SDC_REINIT:
Ds1620Init(pDataBuf,pCfg);
break;
/* case SDC_READ_TEMP_HI: */
case SDC_GET_UPPER_LIMIT:
if(maxlen!=sizeof(int))return SDE_INVALID_ARG;
access1620(pCfg,DS1620_READ_TH, 0, &temp_ushort);
*(int *)pParam=Ds1620Dat_Tmp(temp_ushort);
break;
/* case SDC_READ_TEMP_LO: */
case SDC_GET_LOWER_LIMIT:
if(maxlen!=sizeof(int))return SDE_INVALID_ARG;
access1620(pCfg,DS1620_READ_TL, 0, &temp_ushort);
*(int *)pParam=Ds1620Dat_Tmp(temp_ushort);
break;
/* case SDC_WRITE_TEMP_HI: */
case SDC_SET_UPPER_LIMIT:
if(maxlen!=sizeof(int))return SDE_INVALID_ARG;
access1620(pCfg,DS1620_READ_TH, 0, &temp_ushort);
if(*(int *)pParam!=Ds1620Dat_Tmp(temp_ushort))
{
temp_ushort=Ds1620Tmp_Dat(*(int*)pParam);
access1620(pCfg,DS1620_WRITE_TH, temp_ushort, NULL);
}
break;
/* case SDC_WRITE_TEMP_LO: */
case SDC_SET_LOWER_LIMIT:
if(maxlen!=sizeof(int))return SDE_INVALID_ARG;
access1620(pCfg,DS1620_READ_TL, 0, &temp_ushort);
if(*(int *)pParam!=Ds1620Dat_Tmp(temp_ushort))
{
temp_ushort=Ds1620Tmp_Dat(*(int*)pParam);
access1620(pCfg,DS1620_WRITE_TL, temp_ushort, NULL);
}
break;
case SDC_START_CONVERT:
access1620(pCfg,DS1620_START_CONVERT_T, 0, 0);
break;
case SDC_STOP_CONVERT:
access1620(pCfg,DS1620_STOP_CONVERT_T, 0, 0);
break;
case SDC_WRITE_CONFIG:
access1620(pCfg,DS1620_WRITE_CONFIG, *(int*)pParam, NULL);
break;
case SDC_READ_CONFIG:
if(maxlen!=sizeof(int))return SDE_INVALID_ARG;
access1620(pCfg,DS1620_READ_CONFIG, 0, &temp_ushort);
*(USHORT *)pParam=temp_ushort;
break;
default:
return SDE_UNKNOW_CMD;
}/* end of switch(cmd) */
return SDE_OK;
}
char *Ds1620BspInit(int DEV, char *FreeMemPtr, Ds1620CfgStruct *cfg)
{
InstallSD(DEV,Ds1620Read,NULL,Ds1620Cntrl,FreeMemPtr);
Ds1620Init(FreeMemPtr, cfg);
FreeMemPtr += sizeof(Ds1620CfgStruct);
memcpy(FreeMemPtr,"***DsDat",8);
FreeMemPtr += 8;
return FreeMemPtr;
}
static void access1620(Ds1620CfgStruct *pCfg, UCHAR byInstuction, USHORT wPara, USHORT *wRtnValue)
{
/* 如果要發送一條1620指令,需要先將復位引腳拉高,然后發出控制字,
該引腳拉低之后表示一條指令的結束 */
SetLLDat(&pCfg->Rst,1);
delay1620();
switch (byInstuction) {
case DS1620_READ_TEMPERATURE:
write1620(pCfg,DS1620_READ_TEMPERATURE, 8);
*wRtnValue = read1620(pCfg,9);
break;
case DS1620_READ_COUNTER:
write1620(pCfg,DS1620_READ_COUNTER, 8);
*wRtnValue = read1620(pCfg,9);
break;
case DS1620_READ_SLOPE:
write1620(pCfg,DS1620_READ_SLOPE, 8);
*wRtnValue = read1620(pCfg,9);
break;
case DS1620_START_CONVERT_T:
write1620(pCfg,DS1620_START_CONVERT_T, 8);
break;
case DS1620_STOP_CONVERT_T:
write1620(pCfg,DS1620_STOP_CONVERT_T, 8);
break;
case DS1620_WRITE_TH:
write1620(pCfg,DS1620_WRITE_TH, 8);
write1620(pCfg,wPara, 9);
/* 寫指令結束之后需要延時10ms之后才可以繼續工作。下同。*/
tm_wkafter(1);
break;
case DS1620_WRITE_TL:
write1620(pCfg,DS1620_WRITE_TL, 8);
write1620(pCfg,wPara, 9);
tm_wkafter(1);
break;
case DS1620_READ_TH:
write1620(pCfg,DS1620_READ_TH, 8);
*wRtnValue = read1620(pCfg,9);
break;
case DS1620_READ_TL:
write1620(pCfg,DS1620_READ_TL, 8);
*wRtnValue = read1620(pCfg,9);
break;
case DS1620_WRITE_CONFIG:
write1620(pCfg,DS1620_WRITE_CONFIG, 8);
write1620(pCfg,wPara, 8);
break;
case DS1620_READ_CONFIG:
write1620(pCfg,DS1620_READ_CONFIG, 8);
*wRtnValue = read1620(pCfg,8);
break;
}
delay1620();
SetLLDat(&pCfg->Rst,0);
SetLLDat(&pCfg->Clk,0); /* 保證1620處于連續轉換狀態 */
}
/******************************************************************************
* void write1620(pCfg,USHORT wCode, UCHAR byBits) *
* Input: *
* wCode : 發向1620的設置控制字或者數據 *
* byBits: 控制字/數據的長度 *
******************************************************************************/
static void write1620(Ds1620CfgStruct *pCfg,USHORT wCode, UCHAR byBits)
{
int i;
SetLLDat(&pCfg->Dir,1);
for(i=0;i < byBits; i++){
int bit=(wCode & (1<<i))?1:0;
SetLLDat(&pCfg->Clk,0);
SetLLDat(&pCfg->Dq,bit);
delay1620();
SetLLDat(&pCfg->Clk,1);
delay1620();
}
}
/******************************************************************************
* USHORT read1620(pCfg,UCHAR byBits) *
* Input: *
* byBits: 待讀取數據的長度 *
* Return Value: *
* 讀取的數據 *
******************************************************************************/
static USHORT read1620(Ds1620CfgStruct *pCfg,UCHAR byBits)
{
int i;
USHORT wValue = 0;
SetLLDat(&pCfg->Dir,0);
for(i=0;i < byBits; i++){
SetLLDat(&pCfg->Clk,0);
delay1620();
wValue|=(GetLLDat(&pCfg->Dq)<<i);
SetLLDat(&pCfg->Clk,1);
}
return wValue;
}
static void delay1620(void)
{
volatile ULONG i=10;
while (i--);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -