📄 si4702_i2c.c
字号:
/**************************************
Si47XX I2C part
***************************************/
#include "Si4702_common.h"
/***********************************************
MTK GPIO routine claim
***********************************************/
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);
/********************************************************
Before reset make sure following for 2-wire mode:
RCLK = 32KHz
SENB = 1(Bus mode 1, decided by SENB, SDIO must be low)
if use bus mode 2, decided by GPIO1&3
*********************************************************/
void ResetSi47XX_2w(void)
{
RST_PIN_INIT;
SDIO_PIN_INIT;
SCLK_PIN_INIT;
RST_DIR_OUT;
SCLK_DIR_OUT;
SDIO_DIR_OUT;
SDIO_LOW;
RST_LOW;
SCLK_HIGH;
DELAY(DURATION_INIT_1);
RST_HIGH;
DELAY(DURATION_INIT_2);
SDIO_HIGH;
DELAY(DURATION_INIT_3);
}
unsigned char OperationSi47XX_2w(T_OPERA_MODE operation, unsigned char *data, unsigned char numBytes)
{
unsigned char controlWord, j, error = 0;
int i;
/***************************************************
START: make sure here SDIO_DIR =OUT, SCLK = 1, SDIO = 1
****************************************************/
SCLK_HIGH;
SDIO_HIGH;
DELAY(DURATION_START_1);
SDIO_LOW;
DELAY(DURATION_START_2);
SCLK_LOW;
DELAY(DURATION_START_3);
/***************************************************
WRITE CONTROL DATA: make sure here: SLCK = 0; SDIO = 0
****************************************************/
if(operation == READ)
controlWord = 0x21;
else
controlWord = 0x20;
for(i = 7; i>=0; i--)
{
if((controlWord >> i) & 0x01)
SDIO_HIGH;
else
SDIO_LOW;
DELAY(DURATION_LOW/2);
SCLK_HIGH;
DELAY(DURATION_HIGH);
SCLK_LOW;
DELAY(DURATION_LOW/2);
}
/***************************
CHECK ACK for control word
***************************/
SDIO_DIR_IN;
DELAY(DURATION_LOW/2);
SCLK_HIGH;
DELAY(DURATION_HIGH);
if(READ_SDIO != 0)
{
error = 1;
goto STOP;
}
SCLK_LOW;
DELAY(DURATION_LOW/2);
/***************************************
WRITE or READ data
****************************************/
for(j = 0; j < numBytes; j++, data++)
{
if(operation == WRITE)
SDIO_DIR_OUT;
else
SDIO_DIR_IN;
for(i = 7; i>=0; i--)
{
if(operation == WRITE)
if((*data >> i) & 0x01)
SDIO_HIGH;
else
SDIO_LOW;
DELAY(DURATION_LOW/2);
SCLK_HIGH;
DELAY(DURATION_HIGH);
if(operation == READ)
*data = (*data << 1) | READ_SDIO;
SCLK_LOW;
DELAY(DURATION_LOW/2);
}
/******************************
CHECK ACK or SEND ACK=0
*******************************/
if(operation == WRITE)
SDIO_DIR_IN;
else
{
SDIO_DIR_OUT;
if(j == (numBytes - 1))
SDIO_HIGH;
else
SDIO_LOW;
}
DELAY(DURATION_LOW/2);
SCLK_HIGH;
DELAY(DURATION_HIGH);
if(operation == WRITE)
if(READ_SDIO != 0)
{
error = 1;
goto STOP;
}
SCLK_LOW;
DELAY(DURATION_LOW/2);
}
/****************************
STOP: make sure here: SCLK = 0
*****************************/
STOP:
SDIO_DIR_OUT;
SDIO_LOW;
DELAY(DURATION_STOP_1);
SCLK_HIGH;
DELAY(DURATION_STOP_2);
SDIO_HIGH;
DELAY(DURATION_STOP_3);
return(error);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -