📄 hal9255.c
字号:
#include "hal9255.h"
//data is stable on the rising edge of clk
//Data format, D20-D0 can be in/out according the cmd
//C4-C0, D20-D0
//The cmd should be supported is just 11011b which is used to read FM frequency.
//FM:D20=L,AM:D20=H;
//D19 D18D17D16_D15D14D13D12_D11D10D9D8·D7D6D5D4_D3D2D1D0MHz
//115.80MHz
#if (FMRX_MODE == FMRX_9255)
#if(BOARD_ID==EVB_V1)
sbit DCLK=P1^7;/*假设由P1.7和P1.6控制*/
sbit SDAT=P1^6;
#define SDAT_OUTPUT() (P1_DDR|=0x40)
#define SDAT_INPUT() (P1_DDR&=0xBF)
#define DCLK_OUTPUT() (P1_DDR|=0X80)
#endif
#define DELAY_TIME 8
#define DELAY(x) DelayUs(x)
///////////////////////////////////////////
//Define 9255 CMD
//#define CMD_MSB
#ifdef CMD_MSB
#define CMD_WAIT (0X00<<3) //Only the high 5bits is effective
#define CMD_RST (0X1C<<3)
#define CMD_RSTDONE (0X19<<3)
#define CMD_READFM (0X1B<<3)
#define CMD_READAM (0X19<<3) //??
#define CMD_DISABLE (0X10<<3)
#else
#define CMD_WAIT (0X00) //Only the high 5bits is effective
#define CMD_RST (0X1C)
#define CMD_RSTDONE (0X19)
#define CMD_READFM (0X1B)
#define CMD_READAM (0X19) //??
#define CMD_DISABLE (0X10)
#endif
#define FM_LOW 0X00
#define AM_HIGH 0X01
#define CMD_BITS 5
#define DATA_BITS 21
static BYTE FMFreq[5];
static void _halI2CInit(void)
{
SDAT_OUTPUT();
DCLK_OUTPUT();
SDAT = 0;
DCLK = 1;
return;
}
static void halSend1(void)
{
/*发送1,在SCL为高电平时使SDA信号为高*/
SDAT_OUTPUT();
DCLK_OUTPUT() ;
SDAT=1;
DCLK=0;
DELAY(DELAY_TIME);
DCLK=1;
DELAY(DELAY_TIME);
return;
}
static void halSend0(void) /* SEND ACK */
{
/*发送0,在SCL为高电平时使SDA信号为低*/
SDAT_OUTPUT();
DCLK_OUTPUT();
SDAT=0;
DCLK=0;
DELAY(DELAY_TIME);
DCLK=1;
DELAY(DELAY_TIME);
//DCLK=0;
//DELAY(DELAY_TIME);
return;
}
static void halSendClk()
{
/*发送0,在SCL为高电平时使SDA信号为低*/
//SDAT_OUTPUT();
DCLK_OUTPUT();
//SDAT=0;
DCLK=0;
DELAY(DELAY_TIME);
DCLK=1;
DELAY(DELAY_TIME);
return;
}
static void _hal9255CMD(BYTE bCmd)
{
BYTE i;
BYTE cmd = bCmd;
_halI2CInit();
DelayMs(1);
#ifdef CMD_MSB
//Send CMD
for(i=0; i<CMD_BITS; i++){
if(cmd&0x80){ //Send MSB first
halSend1();
}else{
halSend0();
}
cmd <<= 1;
}
#else //LSB First
for(i=0; i<CMD_BITS; i++){
if(cmd&0x01){ //Send LSB first
halSend1();
}else{
halSend0();
}
cmd >>= 1;
}
#endif
#if 0
//Take care about the direction.
halSendClk();
halSendClk();
halSendClk();
#endif
return;
}
static void _hal9255Data()
{
BYTE i, j;
BYTE bTmp;
BYTE fmam;
//Read Data
SDAT_INPUT();
DCLK_OUTPUT();
//Get data at the rising edge
DCLK=0; //Rising edge
DelayUs(DELAY_TIME);
if(SDAT==1){
fmam = AM_HIGH;
}else{
fmam = FM_LOW;
}
DCLK=1;
DelayUs(DELAY_TIME);
for(i=0; i<5; i++){
bTmp = 0;
for(j=0; j<4; j++){
bTmp=bTmp<<1;
DCLK=0;
DelayUs(DELAY_TIME);
if(SDAT==1){
bTmp=bTmp|0x01;
}
DCLK = 1;
DelayUs(DELAY_TIME);
}
FMFreq[i] = bTmp;
}
halSendClk();
halSendClk();
halSendClk();
for(i=0; i<5; i++){
UartOutText("-I-: FMFreq[i] ");UartOutValue(FMFreq[i], 2);
}
return;
}
void hal9255Init(void)
{
BYTE i, j;
BYTE bTmp;
BYTE fmam;
_halI2CInit();
DelayMs(1);
//Send CMD
_hal9255CMD(CMD_RST);
//_hal9255Data();
DelayMs(1);
_hal9255CMD(CMD_RSTDONE);
_hal9255Data();
DelayMs(1);
return;
}
void hal9255FMRead(void)
{
#if 1
hal9255Init();
_hal9255CMD(CMD_READFM);
_hal9255Data();
#endif
return;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -