大牛们,最近我在整tiny6410外接一个AD转换芯片,但是,抽了半天,找到了GPE,GPQ,HE GPM。这些。我把它们初始化,并设置。但是芯片怎么也读不出来AD值。。求大神级人物指点,不胜感激。。下面附源码。
就是通过外围IO口接了AD芯片,转换后读取数值
源代码:
#include <stdarg.h>
#include "def.h"
#include "system.h"
#include "sysc.h"
#include "uart.h"
#define rGPECON (*(volatile unsigned*)(0x7F008080))
#define rGPEDAT (*(volatile unsigned*)(0x7F008084))
#define rGPEPUD (*(volatile unsigned*)(0x7F008088))
#define rGPQCON (*(volatile unsigned*)(0x7F008180))
#define rGPQDAT (*(volatile unsigned*)(0x7F008184))
#define rGPQPUD (*(volatile unsigned*)(0x7F008188))
#define rGPMCON (*(volatile unsigned*)(0x7F008820))
#define rGPMDAT (*(volatile unsigned*)(0x7F008824))
#define rGPMPUD (*(volatile unsigned*)(0x7F008828))
#define CLKH (0x0000|0xffff)
#define CLKL (0x0000)
#define SCLKH (0x0000|0xffff)
#define SCLKL (0x0000)
//给指定地址赋整数值
#define Outp32(addr, data) (*(volatile u32 *)(addr) = (data))
//读出指定地址的值
#define Inp32(addr) (*(volatile u32 *)(addr))
//UART_BASE
#define UART_BASE (0x7F005000)
//UART_REGS类型在 uart.h 中定义
#define UART0 ((volatile UART_REGS *)UART_BASE)
//函数声明
void delay(int times);
void UART0_Init(u32 uBaudRate);
char Uart_Getc(void);
char Uart_Getch(void);
void Uart_Putc(char data);
void Uart_Gets(char *str);
void Uart_Puts(char *str);
void Uart_Printf(char *fmt,...);
//测试字符串
char gStr[]="HELLO UART0";
void GPIO_int1(void)
{
rGPECON &=~(0xffff);
rGPECON |=0x01<<4*1;
// rGPEPUD=rGPEPUD&(0x2<<(2*1));
rGPQCON &=~(0xffff);
rGPQCON |=0x01<<4*1;
// rGPQPUD=rGPEPUD&(0x2<<(2*1));
rGPMCON &=~(0xffff);
rGPMCON |=0x0000<<4*0;
// rGPMPUD=0x00;
}
unsigned long ads_read(void)//读取数据
{
unsigned char i;
unsigned long j = 0;
rGPEDAT &=~(0x0002); /*可能有问题*/
for(i=0;i<48;i++)
rGPEDAT = ~rGPEDAT; //t4 //DRDY 模式
for(i=0;i<12;i++)
rGPEDAT = ~rGPEDAT; //t2
for(i=0;i<12;i++)
rGPEDAT = ~rGPEDAT; //t3
//DOUT 模式
//在SCLK 的下降沿获取数据
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPQDAT=SCLKH;
// if(DOUT==1) j=j|0x01;
if(rGPMDAT&&0x0001) j=j|0x01;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPQDAT=SCLKL;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
for(i=0;i<23;i++)
{
j=j<<1;
// if(DOUT==1)j=j|0x01;
if(rGPMDAT&&0x0001) j=j|0x01;
rGPQDAT=SCLKH;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPQDAT=SCLKL;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
}
rGPQDAT=SCLKH;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPQDAT=SCLKL;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
rGPEDAT=CLKH;
rGPEDAT=CLKL;
for(i=0;i<248;i++)
rGPEDAT=~rGPEDAT;
for(i=0;i<248;i++)
rGPEDAT=~rGPEDAT;
return j;
}
void ads_convert(unsigned long l_data)
{
unsigned char ads_data[10];
// unsigned char count;
// int m;
float a;
unsigned long b;
// unsigned char ads_data[] = {0, 0, 0, 0, 0,0,0,0,0,0};
if(l_data & 0x00800000)
{
l_data = ~l_data;
l_data = l_data + 1;
l_data = l_data & 0x007fffff;
a = ((float)(l_data))*5.0/0x7fffff;
b = (unsigned long)(a*10000000);
ads_data[0] = '-';
}
else
{
a = ((float)(l_data))*5.0/0x7fffff;
b = (unsigned long)(a*10000000);
ads_data[0] = '+';
}
ads_data[1] = (b/10000000)+0x30;
ads_data[2] = '.';
ads_data[3] = (b/1000000)%10+0x30;
ads_data[4] = (b/100000)%10+0x30;
ads_data[5] = (b/10000)%10+0x30;
ads_data[6] = (b/1000)%10+0x30;
ads_data[7] = (b/100)%10+0x30;
ads_data[8] = (b/10)%10+0x30;
ads_data[9] = b%10+0x30;
// write_com(0x80+2);
// Uart_Puts(ads_data);
Uart_Printf(" : %s\n", ads_data);
// write_date(ads_data[count]);
{
/* m=300+10*count;
print_ascii(m,100,ads_data[count]);
*/
}
}
unsigned long pingjun()
{
unsigned long sum=0;
unsigned long value[16];
unsigned char i;
for (i=0;i<16;i++)
{
value=ads_read();
sum+=value;
}
return sum>>4;
}
/***************************************
中位值:算法
****************************************/
unsigned long filter()
{
// unsigned int N=12;
unsigned long temp;
unsigned char count,i,j;
//unsigned long value_buf[12];
unsigned long value_buf[12];
// unsigned long sum=0;
for ( count=0;count<12;count++)
{
value_buf[count] = pingjun();
delay(20);
}
for (j=0;j<12-1;j++)
{
for (i=0;i<12-j;i++)
{
if ( value_buf>value_buf[i+1] )
{
temp = value_buf;
value_buf = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(12-1)/2];
}
/*
* 程序入口
* */
int main(void)
{
// char ch;
// char str[256];
// char *pStr = gStr;
unsigned long int temp;
GPIO_int1();
//用这个函数主要是获得g_PCLK的值
SYSC_GetClkInform();
UART0_Init(115200);
while(1)
{
Uart_Printf("\n1. 串口轮训方式,单字符输出 \"HELLO world\":\n");
temp=filter();
ads_convert(temp);
}
}
/*
* 延时函数
* */
void delay(int times)
{
int i;
for(;times>0;times--)
for(i=0;i<3000;i++);
}