📄 rda5800_serialcomm.c
字号:
#if (defined(RDA5800))
#include "l1audio_def.h"
#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
//#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_WriteIO(0,SCL);
// DELAY(DURATION_LOW);
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 sdat) /* 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(((sdat>>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;
//kal_prompt_trace(MOD_MED_V,"SerialCommRxByte() dataCache =%d ",dataCache);
}
void SerialCommInit(void)
{
GPIO_WriteIO(0,SDA); //必须拉低,否则在测试模式
DELAY(DURATION_LOW*30);
// GPIO_WriteIO(0,SDA);
GPIO_WriteIO(0,RST);
// GPIO_WriteIO(1, SCL);
DELAY(DURATION_INIT_1);
GPIO_WriteIO(1,RST);
GPIO_WriteIO(1,SDA);
}
void SerialCommCryClkOn(void)
{
GPIO_ModeSetup(CRYCLK,2); /* 32.768kHz reference frequency */
}
void SerialCommCryClkOff(void)
{
GPIO_WriteIO(0,RST);
DELAY(DURATION_LOW);
GPIO_ModeSetup(CRYCLK,0);
GPIO_WriteIO(1,SDA);
GPIO_WriteIO(1,SCL);
// GPIO_WriteIO(0,RST);
// GPIO_WriteIO(0,SDA);
// GPIO_WriteIO(0, SCL);
}
void InitRst(void)
{
GPIO_ModeSetup(SCL,0);
GPIO_ModeSetup(SDA,0);
GPIO_ModeSetup(RST,0);
GPIO_InitIO(1,SCL);
GPIO_InitIO(1,SDA);
GPIO_InitIO(1,RST);
// GPIO_ModeSetup(RST,0);
// GPIO_InitIO(1,RST);
GPIO_WriteIO(0,RST);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -