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

📄 rda_fm_serialcomm.c

📁 主流国产FM芯片RDA5802的在MTK手机平台上的驱动程序,
💻 C
字号:
   

#include "l1audio_def.h"

#define READ	1
#define WRITE	0

#define ADRW 0x20
#define ADRR 0x21

#define DURATION_INIT_1 	20//600ns 
#define DURATION_INIT_2		20//600ns 
#define DURATION_INIT_3 	20//600ns 

#define DURATION_START_1	20//600ns 
#define DURATION_START_2	24//600ns 
#define DURATION_START_3	24//800ns 

#define DURATION_STOP_1		24//800ns 
#define DURATION_STOP_2		20//600ns 
#define DURATION_STOP_3		50//1300ns

#define DURATION_HIGH			26//900ns 
#define DURATION_LOW			70//1600ns

#define POWER_SETTLING		5*1000*80//80ms//50~100ms

/* GPIO definition */
//#define CRYCLK 			6				///32.768 kHz clock请注意修改GPIO_ModeSetup(CRYCLK,*)
//#define CRYCLK_MSK  2				///设置时钟输出类型, 根据Pin需要作出修改
//#define RST     		3       ///LE pin
//#define SDA  				47  		///I2C data pin  
//#define SCL  				48      ///I2C clock pin

void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
void GPIO_InitIO(char direction, char port);
void GPIO_WriteIO(char data,char port);
char GPIO_ReadIO(char port);

#define DELAY(DURATION)		{unsigned int i; for(i = 1; i <= (DURATION); i++){}}

void SerialCommStart(void) /* start or re-start */
{
   GPIO_InitIO(1,SDA);
   GPIO_WriteIO(1,SDA);
   GPIO_WriteIO(1,SCL);
   DELAY(DURATION_START_1);
   GPIO_WriteIO(0,SDA);   
   DELAY(DURATION_START_2);
   GPIO_WriteIO(0,SCL);
   DELAY(DURATION_START_3);/* start condition */
}

void SerialCommStop(void)
{
   GPIO_WriteIO(0,SCL);
   DELAY(DURATION_LOW);
   GPIO_InitIO(1,SDA);
   GPIO_WriteIO(0,SDA);
   DELAY(DURATION_STOP_1);
   GPIO_WriteIO(1,SCL);
   DELAY(DURATION_STOP_2);
   GPIO_WriteIO(1,SDA); /* stop condition */
   DELAY(DURATION_STOP_3);
}

uint8 SerialCommTxByte(uint8 data) /* return 0 --> ack */
{
   int32 i;
   uint8 temp_value = 0;
   for(i=7; (i>=0)&&(i<=7); i--){
      GPIO_WriteIO( 0, SCL); /* low */
      DELAY(DURATION_LOW);
       if(i==7)GPIO_InitIO(1,SDA);
      DELAY(DURATION_LOW);
   
      GPIO_WriteIO(((data>>i)&0x01), SDA);
      DELAY(DURATION_LOW/2);
      GPIO_WriteIO( 1, SCL); /* high */
      DELAY(DURATION_HIGH);
   }
   GPIO_WriteIO(0, SCL); /* low */
   DELAY(DURATION_LOW);
   GPIO_InitIO(0,SDA);/* input  */
   DELAY(DURATION_LOW/2);
   GPIO_WriteIO(1, SCL); /* high */
   DELAY(DURATION_HIGH);
   temp_value = GPIO_ReadIO(SDA);
   //kal_prompt_trace(MOD_MED_V,"SerialCommTxByte()   temp_value =%d ,GPIO_DATA=%d ",temp_value,(SDA));  
   return temp_value;
}

void SerialCommRxByte(uint8 *data, uint8 ack)
{
   int32 i;
   uint32 dataCache;

   dataCache = 0;
   for(i=7; (i>=0)&&(i<=7); i--){
      GPIO_WriteIO(0, SCL);
      DELAY(DURATION_LOW);
       if(i==7)GPIO_InitIO(0,SDA);
      DELAY(DURATION_LOW);
      GPIO_WriteIO(1, SCL);
      DELAY(DURATION_HIGH);
      dataCache |= (GPIO_ReadIO(SDA)<<i);
      DELAY(DURATION_LOW/2);
   }
   
   GPIO_WriteIO(0, SCL);
   DELAY(DURATION_LOW);
   GPIO_InitIO(1,SDA);
   GPIO_WriteIO(ack, SDA);
   DELAY(DURATION_LOW/2);
   GPIO_WriteIO(1, SCL);
   DELAY(DURATION_HIGH);
   *data = (uint8)dataCache;
}

void SerialCommInit(void)
{
	GPIO_ModeSetup(SCL,0);
	GPIO_ModeSetup(SDA,0);

#if (defined(RST))  	
	GPIO_ModeSetup(RST,0);
#endif 	
	   
	GPIO_InitIO(1,SCL);
	GPIO_InitIO(1,SDA);
	
#if (defined(RST))  		
	GPIO_InitIO(1,RST);
#endif	
		
	GPIO_WriteIO(1,SCL);
  GPIO_WriteIO(1,SDA);    
}

void SerialCommCryClkOn(void)
{
	GPIO_ModeSetup(CRYCLK,CRYCLK_MSK); /* 32.768kHz reference frequency */
}

void SerialCommCryClkOff(void)
{              
	DELAY(DURATION_LOW);
	GPIO_ModeSetup(CRYCLK,0);
	GPIO_WriteIO(1,SDA);
	GPIO_WriteIO(1,SCL);  
}



uint8 OperationRDAFM_2w(uint8 operation, uint8 *data, uint8 numBytes)
{
	uint8 j;
	uint8 acknowledge=0;

/***************************************************

START: make sure here SDIO_DIR =OUT, SCLK = 1,	SDIO = 1

****************************************************/
  SerialCommStart();

/***************************************************

WRITE CONTROL DATA: make sure here: SLCK = 0; SDIO = 0

****************************************************/

/***************************

CHECK ACK for control word

***************************/

	if(operation == READ)
		 acknowledge = SerialCommTxByte(ADRR);
	else 
		 acknowledge = SerialCommTxByte(ADRW);
	
 //kal_prompt_trace(MOD_MED_V,"OperationRDAFM_2w   lrjaaaaaa acknowledge =%d ",acknowledge);  


/***************************************

WRITE or READ data

****************************************/	

/******************************

CHECK ACK or SEND ACK=0

*******************************/

for(j = 0; j < numBytes; j++, data++)
{
	if(operation == READ)
	{
	if(j == (numBytes -1))
		SerialCommRxByte(data,1); 
	else
		SerialCommRxByte(data, 0); 
	}	 
	else 
		acknowledge = SerialCommTxByte(*data);   
	//kal_prompt_trace(MOD_MED_V,"OperationRDAFM_2w numBytes =%d acknowledge=%d,data=%x",numBytes,acknowledge,*data);  //lrj  add for test 20060522
	
}
/****************************

STOP: make sure here: SCLK = 0

*****************************/
   SerialCommStop();
   
      return acknowledge;

}

⌨️ 快捷键说明

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