📄 sadc.c
字号:
#include <jz4740.h>
#include <ucos_ii.h>
#include <jztouch.h>
#define TS_AD_COUNT 5
#define M_SADC_CFG_SNUM_5 ((TS_AD_COUNT - 1) << SADC_CFG_SNUM_BIT)
#define SADC_CFG_INIT ( \
(2 << SADC_CFG_CLKOUT_NUM_BIT) | \
SADC_CFG_XYZ1Z2 | \
SADC_CFG_SNUM_5 | \
(1 << SADC_CFG_CLKDIV_BIT) | \
SADC_CFG_PBAT_HIGH | \
SADC_CFG_CMD_INT_PEN )
static unsigned char run_flag = 0;
static u16 ts_TimeOut = 0;
#define TASK_STK_SIZE 1024
static OS_STK SADCTaskStack[TASK_STK_SIZE];
static OS_EVENT *sadcEvent;
#define TOUCH_TASK_PRIO 2
static PFN_SADC touchFunction = 0;
static PFN_SADC sadcFunction = 0;
static PFN_SADC batFunction = 0;
static unsigned int batCountperSec = 0;
static unsigned int sadcCountperSec = 0;
static unsigned char dCount = 0;
unsigned short tsxData = -1,tsyData = -1;
static void ReadTsData()
{
unsigned int dat;
unsigned short xData,yData;
short tsz1Data,tsz2Data;
dat = REG_SADC_TSDAT;
xData = (dat >> 0) & 0xfff;
yData = (dat >> 16) & 0xfff;
printf("%d -> %d %d\r\n",dCount,xData,yData);
dat = REG_SADC_TSDAT;
tsz1Data = (dat >> 0) & 0xfff;
tsz2Data = (dat >> 16) & 0xfff;
//printf("%d -> %d %d\r\n",dCount,tsz1Data,tsz2Data);
tsz1Data = tsz2Data - tsz1Data;
if((tsz1Data > 15) || (tsz1Data < -15))
{
if(tsxData == (unsigned short)-1)
tsxData = xData;
else
tsxData = (tsxData + xData) / 2;
if(tsyData == (unsigned short)-1)
tsyData = yData;
else
tsyData = (tsyData + yData) / 2;
}
// printf("0x%08x \r\n",dat);
dCount ++;
if(dCount > TS_AD_COUNT - 1)
{
if(tsxData != (unsigned short) -1)
{
if(touchFunction)
{
dat = tsxData + (tsyData << 16);
touchFunction((unsigned short *)&dat);
}
printf("x: 0x%d y: 0x%d\r\n",tsxData,tsyData);
tsxData = -1;
tsyData = -1;
}
dCount = 0;
}
}
static void touchTaskEntry(void *arg)
{
unsigned char state;
unsigned char sadcstat;
unsigned char err;
while(run_flag)
{
OSSemPend(sadcEvent,ts_TimeOut,&err);
ts_TimeOut = 0;
sadcstat = REG_SADC_STATE;
state = REG_SADC_STATE & (~REG_SADC_CTRL);
REG_SADC_STATE &= sadcstat;
if(state & SADC_CTRL_PENDM)
{
printf("pen down irq \r\n");
REG_SADC_CTRL &= (~(SADC_CTRL_PENUM | SADC_CTRL_TSRDYM));
REG_SADC_CTRL |= (SADC_CTRL_PENDM);// | SADC_CTRL_TSRDYM);
}
if(state & SADC_CTRL_PENUM)
{
//printf("pen up irq \r\n");
REG_SADC_CTRL &= (~SADC_CTRL_PENDM );
REG_SADC_CTRL |= SADC_CTRL_PENUM;
}
if(state & SADC_CTRL_TSRDYM)
{
//printf("touch ad irq 0x%x \r\n",sadcstat);
ReadTsData();
}
if(state & SADC_CTRL_PBATRDYM)
{
printf("battery ad irq\r\n");
}
if(state & SADC_CTRL_SRDYM)
{
printf("sad ad irq\r\n");
}
__intc_unmask_irq(IRQ_SADC);
}
}
static void handler(unsigned int arg)
{
__intc_mask_irq(IRQ_SADC);
// printf("IRQ_SADC");
OSSemPost(sadcEvent);
}
static int SADC_Init()
{
REG_SADC_ENA = 0;
REG_SADC_STATE &= (~REG_SADC_STATE);
REG_SADC_CTRL = 0x1f;
sadcEvent = OSSemCreate(0);
//__cpm_start_sadc();
REG_SADC_CFG = SADC_CFG_INIT;
run_flag = 1;
request_irq(IRQ_SADC, handler, 0);
OSTaskCreate(touchTaskEntry, (void *)0,
(void *)&SADCTaskStack[TASK_STK_SIZE - 1],
TOUCH_TASK_PRIO);
REG_SADC_SAMETIME = 1;
REG_SADC_WAITTIME = 1000; //per 100 HZ
ts_TimeOut = 0;
REG_SADC_STATE &= (~REG_SADC_STATE);
REG_SADC_CTRL &= (~(SADC_CTRL_PENDM | SADC_CTRL_TSRDYM)); //
REG_SADC_ENA = SADC_ENA_TSEN; // | REG_SADC_ENA;//SADC_ENA_TSEN | SADC_ENA_PBATEN | SADC_ENA_SADCINEN;
}
static int SADC_DeInit()
{
REG_SADC_ENA = 0;
__intc_mask_irq(IRQ_SADC);
OSTimeDly(20);
run_flag = 0;
__cpm_stop_sadc();
}
void initTouch(PFN_SADC touchfn)
{
touchFunction = touchfn;
}
void initBattery(int countpersec,PFN_SADC batfn)
{
batCountperSec = countpersec;
batFunction = batfn;
}
void initSadc(int countpersec,PFN_SADC sadcfn)
{
sadcCountperSec = countpersec;
sadcfn = sadcfn;
}
int TS_init(void)
{
return SADC_Init();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -