📄 复件 rda5800.c
字号:
#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 + -