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

📄 si47xx_i2c.c

📁 si47xx FM 收音机的程序,通过单片机来控制搜台灯功能
💻 C
字号:
/**************************************

Si47XX I2C part

***************************************/

#include "Si47xx_common.h"
#include "l1audio_def.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~40MHz, set by "GPIO_ModeSetup(RCLK,3)"=>32.768KHz
	GPO1 = 1;
	GPO2 = 0;
************************************************/
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 SENB = 1, chip address is 1100011
	if(operation == READ)
		controlWord = 0xC7;
	else 
		controlWord = 0xC6;
		
//if SENB = 0, chip address is 0010001
/*		
	if(operation == READ)
		controlWord = 0x23;
	else 
		controlWord = 0x22;
*/	
	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 + -