主题 : tiny6410有哪些外接的IO口? 复制链接 | 浏览器收藏 | 打印
每天早晨叫醒我的不是闹钟,而是梦想!!
级别: 新手上路
UID: 74166
精华: 0
发帖: 37
金钱: 185 两
威望: 37 点
贡献值: 0 点
综合积分: 74 分
注册时间: 2012-07-20
最后登录: 2014-03-26
楼主  发表于: 2013-04-08 17:47

 tiny6410有哪些外接的IO口?

大牛们,最近我在整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++);
}