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

📄 si4702_i2c.c

📁 全球最小的收音芯片代码
💻 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 + -