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

📄 复件 rda5800.c

📁 mega8控制的FM(RDA5800)。
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <avr/io.h>
#include <util/twi.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#define F_CPU 8000000 /* 8MHz processor */ 
/* 设置 TWPS=0 即与分频系数为1 */ 
#define F_TWI 50000 /* 100KHz */ 
#define TWBR_SELECT (((F_CPU/F_TWI)-16)/2)
#define UINT8 uint8_t
#define UINT16 uint16_t
#define UINT32 uint32_t



#define FM_IIC_SLAVE_ADDR_W 0x20
#define FM_IIC_SLAVE_ADDR_R (0x20|1)
#define READ	1
#define WRITE	0

#define ADRW 0x20
#define ADRR 0x21


#define		BIT_SET(a,b)	a|=(1<<b)
#define		BIT_CLR(a,b)	a&=(~(1<<b))
#define		BIT_INV(a,b)   	a^=(1<<b)
#define		BIT_STATUS(a,b) a&(1<<b)

UINT8 com_buf;

unsigned char Rda5800_initialization_reg[]={
//0x00,0x00,
//0x00,0x00,	
0xd8,0x81,	//0x02,
0x6A,0x00,
0x44,0x00,	//0x04,
0x08,0xff,  //0x05, lilin, 06/22, 0x10f8, //0x05
0x00,0x00,
0x00,0xcd,
0x00,0x96,
0x00,0x20,
0x41,0x63,
0x08,0x06,
0x58,0x00,
0x58,0x00,
0x58,0x00,
0x58,0x00,
0x4c,0x17,	//0x10,  seek_singlestep, 0x4817,
0x20,0xa2,
0x00,0x00,
0x00,0x0f,
0x06,0xde,
0xec,0xc0,
0x02,0x00,
0x53,0x83,
0x95,0xa4,
0xe8,0x48,
0x05,0x00,	//0x0500, lilin, 06/22, 0x0500,
0x00,0xa4,  //0x00a4, lilin, 06/22, 0x00a4,
0x88,0x9b,
0x0d,0x84,
0x4f,0x04,
0x88,0x32,
0x7f,0x71,
0x06,0x60,
0x40,0x10,
0x60,0x02,
0x18,0x08,
0x64,0x58,
0x78,0x7f,
0x01,0x00,
0xc0,0x40,
0xc0,0x20,
0x00,0x24,
0x04,0x00,
0x00,0x20,
};

void ini_uart(uint16_t m_baud)//m_baud=207时,bode=4800 f=8M //12,9600,1//25,4800,1
{
	UBRRH = (UINT8)(m_baud>>8);
	UBRRL = (UINT8)m_baud;
	UCSRA = (1<<U2X);
	/* 设置帧格式: 8 个数据位, 1 个停止位*/
	UCSRC = (1<<URSEL)|(3<<UCSZ0);
	/* 接收器与发送器终端使能,接收器与发送器使能*/
	UCSRB = (1<<RXEN)|(1<<TXEN);//|(1<<TXCIE)|(1<<RXCIE);
	/*禁用终端
	cli();*/
}

#define  SDA  4
#define  SCL  5
void GPIO_InitIO(UINT8 dir,UINT8 pin){
if(dir){BIT_SET(DDRC,pin);}
else  BIT_CLR(DDRC,pin);
}

void GPIO_WriteIO(UINT8 data,UINT8 pin){
if(data){BIT_SET(PORTC,pin);}
else  BIT_CLR(PORTC,pin);
 }

UINT8 GPIO_ReadIO(UINT8 pin){
	if(BIT_STATUS(PINC,pin))
		return 1 ;
	else
		return 0 ;
		
}


void SerialCommStart(void) /* start or re-start */
{
  // GPIO_WriteIO(0,SCL);
 //   _delay_us (10)(DURATION_LOW);
   GPIO_InitIO(1,SDA);
   GPIO_WriteIO(1,SDA);
   GPIO_WriteIO(1,SCL);
    _delay_us (10);
   _delay_us (10);
   GPIO_WriteIO(0,SDA);   
    _delay_us (10);
   GPIO_WriteIO(0,SCL);
    _delay_us (10);/* start condition */
}

void SerialCommStop(void)
{
   GPIO_WriteIO(0,SCL);
    _delay_us (10);
   GPIO_InitIO(1,SDA);
   GPIO_WriteIO(0,SDA);
    _delay_us (10);
   GPIO_WriteIO(1,SCL);
    _delay_us (10);
   GPIO_WriteIO(1,SDA); /* stop condition */
    _delay_us (10);
}

UINT8 SerialCommTxByte(UINT8 data) /* return 0 --> ack */
{
   UINT32 i;
   UINT8 temp_value = 0;
   for(i=7; (i>=0)&&(i<=7); i--){
      GPIO_WriteIO( 0, SCL); /* low */
        ;
       if(i==7)GPIO_InitIO(1,SDA);
        ;
   
      GPIO_WriteIO(((data>>i)&0x01), SDA);
        ;
      GPIO_WriteIO( 1, SCL); /* high */
        ;
   }
   GPIO_WriteIO(0, SCL); /* low */
     ;
   GPIO_InitIO(0,SDA);/* input  */
     ;
   GPIO_WriteIO(1, SCL); /* 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)
{
   UINT32 i;
   UINT32 dataCache;

   dataCache = 0;
   for(i=7; (i>=0)&&(i<=7); i--){
      GPIO_WriteIO(0, SCL);
        ;
       if(i==7)GPIO_InitIO(0,SDA);
        ;
      GPIO_WriteIO(1, SCL);
        ;
      dataCache |= (GPIO_ReadIO(SDA)<<i);
        ;
   }
   
   GPIO_WriteIO(0, SCL);
     ;
   GPIO_InitIO(1,SDA);
   GPIO_WriteIO(ack, SDA);
     ;
   GPIO_WriteIO(1, SCL);
      ;
   *data = (UINT8)dataCache;
   //kal_prompt_trace(MOD_MED_V,"SerialCommRxByte()   dataCache =%d ",dataCache);  
}


void SerialCommInit(void)
{

   GPIO_InitIO(1,SDA);
   GPIO_InitIO(1,SCL);
   GPIO_WriteIO(1,SDA);
   GPIO_WriteIO(1,SCL);
        ;

}


unsigned char OperationRda5800_2w(unsigned char operation, unsigned char *data, unsigned char numBytes)
{
	unsigned char controlWord,  j, error = 0;
	int i;
	 UINT32 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,"OperationRda5800_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,"OperationRda5800_2w numBytes =%d acknowledge=%d,data=%x",numBytes,acknowledge,*data);  //lrj  add for test 20060522
	
}
/****************************

STOP: make sure here: SCLK = 0

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

}





#if 0
UINT8 IIC_transfer (UINT8 SLA,UINT8 *data,UINT8 nSize) 
{
	DDRC &= ~(1<<PC5 | 1<<PC4);PORTC |= (1<<PC5 | 1<<PC4); // 调整端口设置,设置为上拉输入
	TWBR = TWBR_SELECT;// 设置TWI波特率 
	TWSR&=0XFC;
	TWCR = 1<<TWSTA | 1<<TWEN; 
	//TWCR = 1<<TWSTA | 1<<TWEN | 1<<TWINT;
	while (!(TWCR & (1<<TWINT))); // 发送START信号,等待TWIT=1 // 

	while(!(UCSRA & (1<<UDRE)));//等待发送缓冲器为空
	UDR=1;
	if ((TWSR&0xf8) != TW_START) return TW_START;// START信号成功发送了吗?不成功返回相应错误信息 // 
	//BIT_CLR(TWCR,TWSTA);
	TWDR = SLA; TWCR = 1<<TWINT | 1<<TWEN; while (!(TWCR & (1<<TWINT))); // 发送命令,等待发送完成 // 
	while(!(UCSRA & (1<<UDRE)));//等待发送缓冲器为空
	UDR=2;
	// 命令成功发送(或寻址成功)了吗?不成功返回相应错误信息 // 
	if (SLA & 0x01) // 1=读命令(主控接收器) 0=写命令(主控发送器) 
		{ if ((TWSR&0xf8) != TW_MR_SLA_ACK) return TW_MR_SLA_ACK; } 
	else
		{ if ((TWSR&0xf8) != TW_MT_SLA_ACK) return TW_MT_SLA_ACK; } 

	// 传送字节数!=0 ?// 
	if (nSize !=0) 
	{ 
		if (SLA & 0x01) // 1=主控接收器操作 
		{ 
			do 
			{ 
				// 若准备接收最后一个字节发送则发NACK,否则发送ACK // 
				if (nSize ==1) { TWCR = 1<<TWINT | 1<<TWEN; } 
				//准备发送NACK 
				else { TWCR = 1<<TWINT | 1<<TWEA | 1<<TWEN; } 
				//准备发送ACK // 等待接收完成 // 
				while (!(TWCR & (1<<TWINT))); 
				// 数据接收成功? // 
				if (nSize ==1) 
				// 最后字节成功接收? 不成功返回相应错误信息 // 
				{ 
					if ((TWSR&0xf8) != TW_MR_DATA_NACK) return TW_MR_DATA_NACK;
				} 
				else 
				// 非最后字节成功接收? 不成功返回相应错误信息 // 
				{ 
					if ((TWSR&0xf8) != TW_MR_DATA_ACK) return TW_MR_DATA_ACK;
				} 
				// 保存接收数据 // 
				*data =TWDR; data++; 
			}while ( --nSize != 0 ); // 循环发送完 
		} 
		else //0=主控发送器操作 
		{ 
			do 
			{ 
				// 准备送数据,发送,等待发送完成 // 
				TWDR = *data; TWCR = 1<<TWINT | 1<<TWEN; data++; 
				while (!(TWCR & (1<<TWINT))); 
				while(!(UCSRA & (1<<UDRE)));//等待发送缓冲器为空
				UDR=3;
				// 数据发送成功?不成功返回相应错误信息 // 
				if ((TWSR&0xf8) != TW_MT_DATA_ACK) return TW_MT_DATA_ACK; 
			}while ( --nSize != 0 ); // 循环发送完 

⌨️ 快捷键说明

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