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

📄 main.c

📁 AT91RM9200控制PCM编码芯片AIC10
💻 C
字号:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : main.c
//* Object              : main application written in C
//* Creation            : FB   24/10/2002
//*
//*----------------------------------------------------------------------------

extern void AT91F_DBGU_Printk(char *);

#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
//#include "extern.h"


/***************************declare global variable****************************/

//AIC 10的配置参数
volatile unsigned int data_out[8]={0x0001,0x0200,0x0001,0x0404,0x0001,0x0600,0x0001,0x0800};
//1kHz余弦波
volatile  int data_out1[16]={8000,7390,5656,3060,0,-3060,-5656,-7390,-8000,-7390,-5656,-3060,0,3060,5656,7390};
//2kHz余弦波
volatile int data_out2[8]={8000,5656,0,-5656,-8000,-5656,0,5656};									
//  volatile int data_out1[12]={0xfa0,0xd88,0x7d0,0x0,0xf830,0xf278,0xf060,0xf278,0xf830,0x0,0x7d0,0xd88};
volatile unsigned int data_in[16];

	
AT91PS_SSC pSSC=AT91C_BASE_SSC1;

/***************************declare global variable****************************/
void delay(int i)
{
	for(;i>0;i--)
	;
}

void ambe_rst(void)
{
	AT91F_PIO_Enable(AT91C_BASE_PIOA,AT91C_PIO_PA20);        //配置为I/O口 
	AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PIO_PA20);  // I/O口上拉
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PIO_PA20);  //低电平
	delay(10000);
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PIO_PA20);  //高电平
}

void EnAIC10(void)
{

	//数字话明话		SSC1←→AIC10
	//K2
	AT91F_PIO_Enable(AT91C_BASE_PIOA,AT91C_PIO_PA27);        //配置为I/O口 
	AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PIO_PA27);  // I/O口上拉
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PIO_PA27);  //高电平
	delay(1000);
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PIO_PA27);  //低电平
	//K1
	AT91F_PIO_Enable(AT91C_BASE_PIOA,AT91C_PIO_PA28);        //配置为I/O口 
	AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PIO_PA28);  // I/O口上拉
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PIO_PA28);  //高电平
	delay(1000);
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PIO_PA28);  //低电平
	//PWDA
	AT91F_PIO_Enable(AT91C_BASE_PIOA,AT91C_PIO_PA19);        //配置为I/O口 
	AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PIO_PA19);  // I/O口上拉
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PIO_PA19);  //低电平
	delay(1000);
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PIO_PA19);  //高电平
	//ARST 复位AIC10
	AT91F_PIO_Enable(AT91C_BASE_PIOA,AT91C_PIO_PA4);        //配置为I/O口 
	AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PIO_PA4);  // I/O口上拉
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PIO_PA4);  //高电平
	delay(100);
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PIO_PA4);  //低电平
	delay(100);
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PIO_PA4);  //高电平
	
}

void AIC10_R_W(void)
{
	int i,j;
 //* Configure SSC1 PIOs  TF/TK/TD  
	*AT91C_PIOB_PDR= ((unsigned int) AT91C_PB9_RD1     ) |
					 ((unsigned int) AT91C_PB10_RK1    ) |	//add by hhf 
					 ((unsigned int) AT91C_PB11_RF1    ) |	//add by hhf
					 ((unsigned int) AT91C_PB8_TD1     ) |
					 ((unsigned int) AT91C_PB7_TK1     ) |
			 		 ((unsigned int) AT91C_PB6_TF1     ) ;
/*********************************************************************************/
	*AT91C_PIOB_ASR= ((unsigned int) AT91C_PB9_RD1     ) |
					 ((unsigned int) AT91C_PB10_RK1    ) | 
					 ((unsigned int) AT91C_PB11_RF1    ) |
					 ((unsigned int) AT91C_PB8_TD1     ) |
					 ((unsigned int) AT91C_PB7_TK1     ) |
			 		 ((unsigned int) AT91C_PB6_TF1     ) ;
/*********************************************************************************/
 //* Configure PMC by enabling SSC1 clock  
       	*AT91C_PMC_PCER |= 1 << AT91C_ID_SSC1;    /* enable the SSC1 peripheral clock */
 //* Reset All the Peripheral 
    	*AT91C_SSC1_CR = AT91C_SSC_SWRST ;
//* Clear Transmit and Receive Counters
		AT91F_PDC_Close((AT91PS_PDC) &(pSSC->SSC_RPR));
 //* Define the Clock Mode Register
 // for MCK ei 60000000 => 21 
        *AT91C_SSC1_CMR = 0;      //modified by hhf 时钟分频器无效
        
//    *AT91C_SSC1_RCMR=0x00000402;//时钟RK引脚,RK引脚是输入模式,接收启动模式为连续,RF下降沿启动接收
	*AT91C_SSC1_RCMR=0x00000402;
	*AT91C_SSC1_RFMR=0x0000008f;//数据长度16bit,高位在先,一帧一个数据字 
	
//	*AT91C_SSC1_TCMR=0x00000522;//时钟TK引脚,TK引脚是输入模式,发送启动是检测TF上升沿模式,
								//发送启动延迟设置为0
	*AT91C_SSC1_TCMR=0x00000422;
	*AT91C_SSC1_TFMR=0x000000af;//数据长度16bit,数据默认值设置为1,高位在先,一帧一个数据字,
								//帧同步引脚设置为一个SCLK,TF引脚设置为单输入.

	AT91C_BASE_SSC1->SSC_IDR = 0xffffffff;	 //中断禁用
	
	//* Enable TX & RX
	*AT91C_SSC1_CR = AT91C_SSC_TXEN | AT91C_SSC_RXEN;  
	
	 //AIC10初始化
	 *AT91C_SSC1_THR = data_out[0]; 
  for (i=1;i<8;i++)
  {
 	  /* Write the TD data */
  	while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ } /* Wait ready */	
  	*AT91C_SSC1_THR = data_out[i]; 
  }
  
//*************以下配置AIC10的DAC通道为16bit传输模式********************
//	*AT91C_SSC1_THR = 0x0001;
//	while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ } /* Wait ready */
//	*AT91C_SSC1_THR = 0x0201;
//	while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ } /* Wait ready */
//**********************************************************************   
 
 
    
 /********************以下循环发送1kHz余弦波***************************/   
/*
 while(1)
	{
		for(i=0;i<16;i++)
		{
			*AT91C_SSC1_THR =  data_out1[i]; 
			while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ }
			}
	}
*/
/***********************************************************************/ 		

 /********************以下循环发送2kHz余弦波***************************/   
/*
 while(1)
	{
		for(i=0;i<8;i++)
		{
			*AT91C_SSC1_THR =  data_out2[i]; 
			while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ }
		}
	}
*/
/***********************************************************************/ 	
	
	
	
 /********************以下循环发送1kHz余弦波并接收数据***************************/   

 		j=0;
		i=1;
		*AT91C_SSC1_THR =  data_out2[0];
		//读出RHR
		data_in[0]= *AT91C_SSC1_RHR ;						//读出RHR 
	    while((*AT91C_SSC1_SR & AT91C_SSC_RXRDY)==0){ }//查询是否接收准备好
	   
	while(1)
	{
		
			while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ }//查询是否发送完
			*AT91C_SSC1_THR =  data_out2[i];				//发送第i个样点
			
			
//			data_in[i]= *AT91C_SSC1_RHR ;
			while((*AT91C_SSC1_SR & AT91C_SSC_RXRDY)==0){ }//查询是否接收准备好
	    	data_in[i]= *AT91C_SSC1_RHR ;	
	    	
	    	i=i+1;
	    	j=j+1;
	    	if(i==8)	i=0;
	    	if(j==100)  break;
		
	}
	while(1)
	{
		for(i=0;i<8;i++)
		{
			*AT91C_SSC1_THR =  (data_in[i]>>1)<<1; 
			while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ }
		}
	}
/***********************************************************************/ 	
/*	
	
	while (1)
	{
	   
	  //请求从通信 
	  *AT91C_SSC1_THR = 0x0001;
	  	  
	  while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ }//查询是否发完 
	  *AT91C_SSC1_THR = 0x1400; 						//发送读寄存器2命令
	  
	  //读出RHR
	  while((*AT91C_SSC1_SR & AT91C_SSC_RXRDY)==0){ }//查询是否接收准备好
	  data_in[0]= *AT91C_SSC1_RHR ;						//读出RHR
	  
	  while((*AT91C_SSC1_SR & AT91C_SSC_TXRDY)==0){ }//查询是否发完 
	  delay(1000);
	  AT91C_BASE_DBGU->DBGU_THR=(data_in[0]);

   }
 */

}


int main()
{
    ambe_rst();//禁止ambe2000
    EnAIC10();
    AIC10_R_W();
    while(1)
    {
    	
       ;
    }
    
    

}

⌨️ 快捷键说明

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