?? adc.c
字號:
/*
****************************************************************************
* 寧波中科集成電路設計中心 版權所有 Copyright 2005
* http:\\www.nbicc.com
*文件名: adc.c
*程序員: 夏鵬 xpsonny@nbicc.com
*主要內容:adc驅動相關
*
*如有問題或BUG,請登錄www.wsn.net.cn 提問或用郵件和作者聯系
****************************************************************************
*/
#include "adc.h"
#include "os.h"
#include "radiocontrol.h"
#include "sensor.h"
static result_t ADCDataReady(uint8_t port, uint16_t value); // 加入對應port的數據接收處理調用
static result_t ADCHPLDataReady(uint16_t data);
static result_t ADCStartGet(uint8_t newState, uint8_t port);
static void ADCHPLInitPortmap(void);
static result_t ADCHPLInit(void);
static result_t ADCHPLSamplePort(uint8_t port);
static uint16_t ADCM_ReqPort;
static uint16_t ADCM_ReqVector;
static uint16_t ADCM_ContReqMask;
static bool HPLADCM_init_portmap_done;
static uint8_t adcPortmap[OSH_ADC_PORTMAPSIZE];
result_t ADCHPLInit(void)
{
ADCHPLInitPortmap();
{ uint8_t atomicState = AtomicStart();
{
* (volatile unsigned char *)(0x06 + 0x20) = (1 << 3) | (6 << 0);
* (volatile unsigned char *)(0x07 + 0x20) = 0;
}
AtomicEnd(atomicState); }
return SUCCESS;
}
result_t ADCControlInit(void)
{
{ uint8_t atomicState = AtomicStart();
{
ADCM_ReqPort = 0;
ADCM_ReqVector = ADCM_ContReqMask = 0;
}
AtomicEnd(atomicState); }
return ADCHPLInit();
}
result_t ADCBindPort(uint8_t port, uint8_t adcPort)
{
if (
port < OSH_ADC_PORTMAPSIZE &&
port != OS_ADC_BANDGAP_PORT &&
port != OS_ADC_GND_PORT) {
ADCHPLInitPortmap();
{ uint8_t atomicState = AtomicStart();
adcPortmap[port] = adcPort;
AtomicEnd(atomicState); }
return SUCCESS;
}
else {
return FAIL;
}
}
static result_t ADCDataReady(uint8_t port, uint16_t value){
unsigned char result;
switch (port) {
case OS_ADC_CC_RSSI_PORT:
result = RadiocontrolRSSIADCDataReady(value);
break;
case OS_ADC_PHOTO_PORT:
result = SensorInternalPhotoADCDataReady(value);
break;
case OS_ADC_TEMP_PORT:
result = SensorInternalTempADCDataReady(value);
break;
default:
result = 0;
}
return result;
}
static result_t ADCHPLDataReady(uint16_t data)
{
uint16_t doneValue = data;
uint8_t donePort;
result_t Result;
{ uint8_t atomicState = AtomicStart();
{
donePort = ADCM_ReqPort;
if (((1 << donePort) & ADCM_ContReqMask) == 0) {
ADCM_ReqVector &= ~(1 << donePort);
}
if (ADCM_ReqVector) {
do {
ADCM_ReqPort++;
ADCM_ReqPort = ADCM_ReqPort == OSH_ADC_PORTMAPSIZE ? 0 : ADCM_ReqPort;
}
while (((
1 << ADCM_ReqPort) & ADCM_ReqVector) == 0);
ADCHPLSamplePort(ADCM_ReqPort);
}
}
AtomicEnd(atomicState); }
Result = ADCDataReady(donePort, doneValue);
{ uint8_t atomicState = AtomicStart();
{
if (Result == FAIL && ADCM_ContReqMask & (1 << donePort)) {
ADCM_ContReqMask &= ~(1 << donePort);
}
}
AtomicEnd(atomicState); }
return SUCCESS;
}
static result_t ADCStartGet(uint8_t newState, uint8_t port)
{
uint16_t PortMask;
uint16_t oldReqVector;
result_t Result = SUCCESS;
if (port > OSH_ADC_PORTMAPSIZE) {
return FAIL;
}
PortMask = 1 << port;
{ uint8_t atomicState = AtomicStart();
{
if ((PortMask & ADCM_ReqVector) != 0) {
Result = FAIL;
}
else {
oldReqVector = ADCM_ReqVector;
ADCM_ReqVector |= PortMask;
if (newState == ADCM_CONTINUOUS_CONVERSION) {
ADCM_ContReqMask |= PortMask;
}
if (oldReqVector == 0) {
ADCM_ReqPort = port;
Result = ADCHPLSamplePort(port);
}
}
}
AtomicEnd(atomicState); }
return Result;
}
result_t ADCGetData(uint8_t port)
{
return ADCStartGet(ADCM_SINGLE_CONVERSION, port);
}
void ADCHPLInitPortmap(void)
{
{ uint8_t atomicState = AtomicStart();
{
if (HPLADCM_init_portmap_done == FALSE) {
int i;
for (i = 0; i < OSH_ADC_PORTMAPSIZE; i++)
adcPortmap[i] = i;
adcPortmap[OS_ADC_BANDGAP_PORT] = OSH_ACTUAL_BANDGAP_PORT;
adcPortmap[OS_ADC_GND_PORT] = OSH_ACTUAL_GND_PORT;
HPLADCM_init_portmap_done = TRUE;
}
}
AtomicEnd(atomicState); }
}
void __attribute((signal)) __vector_21(void)
{
uint16_t data = * (volatile unsigned int *)(unsigned int )& * (volatile unsigned char *)(0x04 + 0x20);
data &= 0x3ff;
* (volatile unsigned char *)(0x06 + 0x20) |= 1 << 4;
* (volatile unsigned char *)(0x06 + 0x20) &= ~(1 << 7);
EnableInterrupt();
ADCHPLDataReady(data);
}
static result_t ADCHPLSamplePort(uint8_t port)
{
{ uint8_t atomicState = AtomicStart();
{
* (volatile unsigned char *)(0x07 + 0x20) = adcPortmap[port] & 0x1F;
}
AtomicEnd(atomicState); }
* (volatile unsigned char *)(0x06 + 0x20) |= 1 << 7;
* (volatile unsigned char *)(0x06 + 0x20) |= 1 << 6;
return SUCCESS;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -