⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ATMEL ATSAM7S64处理器部分控制程序。
💻 C
字号:
/*********************************************************************************************
* File:	adc.c
* Author:	Embest z.j.zheng
* Desc:	test adc function,super terminal get the digital converted from adc through the uart
* History:	
*********************************************************************************************/
/*------------------------------------------------------------------------------------------*/
/*								include files												*/
/*------------------------------------------------------------------------------------------*/
#include "Board.h"
#include "dbgu.h"
#include "all_init.h"

/*------------------------------------------------------------------------------------------*/
/*								Global variable										 		*/
/*------------------------------------------------------------------------------------------*/
char data_out[16];
volatile char message[80];
/* Digit Symbol table*/
char Symbol[] = { DIGIT_0, DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4, DIGIT_5, DIGIT_6, DIGIT_7,
    			 DIGIT_8, DIGIT_9, DIGIT_A, DIGIT_B, DIGIT_C, DIGIT_D, DIGIT_E, DIGIT_F};
/* LED segment table */
int Seg[] = { SEGMENT_A, SEGMENT_B, SEGMENT_C, SEGMENT_D, SEGMENT_E, SEGMENT_F, SEGMENT_G, SEGMENT_P};
const int led_sw[6]= {LED1, LED2, LED3,LED3, LED2, LED1};

/*********************************************************************************************
* name:		spi_send
* func:		spi bus send byte
* para:		chr		--in,	send value
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void spi_send(char chr)			
{
	AT91F_SPI_PutChar(AT91C_BASE_SPI,chr,0);                     // send a byte
}

/*********************************************************************************************
* name:		time_dly
* func:		display code
* para:		dly			--in, delay value
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void  time_dly(int  dly)
{  
	int  i;

	for(; dly>0; dly--) 
		for(i=0; i<500; i++);
}

/*********************************************************************************************
* name:		twi_write
* func:		write the data to the eeprom by the twi
* para:		pointer. pointer to the array
* ret:		none
* modify:
* comment:	
*********************************************************************************************/
void twi_write( AT91PS_TWI pTWI,int Numn)
{ 	
	AT91C_BASE_TWI->TWI_CWGR = 0x40f0f;
	pTWI->TWI_CR = AT91C_TWI_MSEN;		
	pTWI->TWI_MMR = (AT91C_TWI_IADRSZ_1_BYTE | (!AT91C_TWI_MREAD) | AT91C_TWI_DADR);
	pTWI->TWI_IADR = 0x0 + Numn;                                //INTERNAL ADDRESS 
	pTWI->TWI_THR =Numn;

	pTWI->TWI_CR = AT91C_TWI_START;                             //start
	while(pTWI->TWI_SR&0x4==0 ){};
	time_dly(100);					
	pTWI->TWI_CR = AT91C_TWI_STOP ;                            //stop
	while(pTWI->TWI_SR&0x1==0){};	
}

/*********************************************************************************************
* name:		twi_read
* func:		read the data from the eeprom by the twi
* para:		none
* ret:		none 
* modify:
* comment:	
*********************************************************************************************/
void twi_read(AT91PS_TWI pTWI,int n)
{	
	AT91C_BASE_TWI->TWI_CWGR = 0x40f0f;
	AT91C_BASE_TWI->TWI_CR = AT91C_TWI_MSEN | AT91C_TWI_SVDIS;
	pTWI->TWI_MMR = (AT91C_TWI_IADRSZ_1_BYTE | AT91C_TWI_MREAD | AT91C_TWI_DADR);	
	pTWI->TWI_IADR = 0x0+n;                                     //INTERNAL ADDRESS 
	pTWI->TWI_CR |= AT91C_TWI_START;	                        //start

	while((pTWI->TWI_SR & 0x2) == 0 ){};
	data_out[n] = pTWI->TWI_RHR;
	time_dly(100);
	pTWI->TWI_CR |= AT91C_TWI_STOP;	                            //stop
	while((pTWI->TWI_SR & 0x1) == 0){};
}

/*********************************************************************************************
* name:		menu
* func:		Usart debug menu
* para:		none		
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void menu( char value)
{
	unsigned int i,j,button_ID,timer0;
	char AD_Data,AD[2];
  
	switch (value) {

		case '1':                                              // leds test
			AT91F_DBGU_Printk("pio output function test.\n\rlook at the leds(Input 0 to quit)..\n\r");
			// led3 is multipex with TWD
			AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED3 ) ;
			AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED3 ) ;		
			do
			{
			timer0++;
			if(timer0 > 0x60000)
				timer0 = 0;
				AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED1|LED2|LED3) ;
				AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_sw[timer0>>16] ) ;
				AT91F_DBGU_Get(&value);
			}while(value != '0');
			AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED1|LED2|LED3) ;		
		break;
		
		case '2':                                               // spi test
			AT91F_DBGU_Printk("spi function test.\n\rlook at the 8 segment digital ..\n\r");
			AT91F_SPI_Enable(AT91C_BASE_SPI);
			for(i=0;i<16;i++)
			{
			spi_send(~Symbol[i]);                               // 8 segment digital display number from 0 to f
	   		time_dly(500);
	    	}
	    	spi_send(~Symbol[0]);
	    	time_dly(500);
	    	AT91F_SPI_Disable(AT91C_BASE_SPI);
		break;
		
		case '3':                                              // pwm test								
			AT91F_DBGU_Printk("pwm function test.\n\rlisten to the beep ..\n\r");
			AT91F_PWMC_StartChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0);
			time_dly(10000);
			AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0);		
		break;
		
		case '4':                                              // adc test
			AT91F_DBGU_Printk("adc function test.\n\r");
			AT91F_ADC_EnableChannel(AT91C_BASE_ADC,AT91C_ADC_CH4);
			AT91F_ADC_StartConversion(AT91C_BASE_ADC);
			for(j=500;j>0;j--);
			AD_Data=AT91F_ADC_GetConvertedDataCH4(AT91C_BASE_ADC);
			AT91F_DBGU_Printk("the current digital output of ADC is:	0x");				
			j=AD_Data;
			j=(j&0xf0)>>4;
			if ((j>=0)&(j<=9)) 
				AD[0]=0x30+j;
			else AD[0]=0x41+j-10;
				j=AD_Data;     
			j=j&0x0f;	
			if ((j>=0)&(j<=9)) 
				AD[1]=0x30+j;
			else AD[1]=0x41+j-10;		 	
				AD[2]='\0';
				AT91F_DBGU_Printk(AD);
			AT91F_DBGU_Printk( "\n\r" );			
		break;
		
		case '5':                                              // button test
			AT91F_DBGU_Printk("PIO input function test.\n\r");
			AT91F_DBGU_Printk("push down any button you want(Input 0 to quit)..\n\r");
			do	
			{ 
			j = AT91F_PIO_GetInput(AT91C_BASE_PIOA);
			button_ID = j&SW_MASK; 
			if ((button_ID&SW1_MASK) == 0)AT91F_DBGU_Printk("\rthe current pushed down button is 	NO.1 ");
			else if ((button_ID&SW2_MASK) == 0)AT91F_DBGU_Printk("\rthe current pushed down button is 	NO.2 ");
			else if ((button_ID&SW3_MASK) == 0)AT91F_DBGU_Printk("\rthe current pushed down button is 	NO.3 ");
			else if ((button_ID&SW4_MASK) == 0)AT91F_DBGU_Printk("\rthe current pushed down button is 	NO.4 ");
			AT91F_DBGU_Get(&value);
			}while( value != '0' );
			AT91F_DBGU_Printk( "\n\r" );					
		break;
		
		case '6':                                               // twi test
		
			AT91F_DBGU_Printk("twi function test\n\r");
			AT91F_DBGU_Printk("Write char 0-f into AT24C02\n\r");
			// Configure PIO controllers to periph mode, in open drain
			AT91F_TWI_CfgPIO();                                 // TWD(PA3) is a multiplex with LED3
			AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,AT91C_PA3_TWD );
			for(i = 0; i <= 15; i++)
			{
				twi_write(AT91C_BASE_TWI,i);                    // write the i number into the at24c02
				twi_read(AT91C_BASE_TWI,i);                     // read the i number out from the at24c02
			}
	
			for(i = 0; i < 10; i++)                             // change into ASCII
				data_out[i] += '0'; 
			for(i = 10; i < 16; i++)	
				data_out[i] += 'a'-10; 	
			data_out[16] = '\0';
	
			AT91F_DBGU_Printk("Read out 16 bytes from AT24C02\n\r");	
			AT91F_DBGU_Printk(data_out);
		break;

		default:
		AT91F_DBGU_Printk("\n\r");
		break;
	}
}

/*********************************************************************************************
* name:		main
* func:		Main function
* para:		none		
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
Main( void )
{
    char value;
	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

	SPI_Init();
	
	adc_Init();
	twi_Init();	
	led_Init();	
	button_Init();
	pwm_Init();	
	
    AT91F_DBGU_Init();                                          // Init DBGU
    AT91F_DBGU_Printk("ATEBSAM7S boards part functions test.--version 050300\n\r");
    AT91F_DBGU_Printk("1)leds test\n\r2)spi test\n\r3)pwm test\n\r4)adc test\n\r5)button test\n\r6)twi test\n\r");
    while(1)
    {
	if (AT91F_DBGU_Get(&value) == 0 ) menu(value);
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -