最近研究si47xx系列芯片

发现比较复杂,可能是因为功能比较多,参考网上的程序
发现比较乱,不过总算移植到stm32上了。这几天再仔细看下手册,优化一下程序。pcb基本完成了,中间改了好几个地方。有机会作个板子。
网上的一段简版代码
 
/******************************************************
START condition:

SCLK: -----------|______
		     
SDIO:-----|_____________
		1  |	2	 |	3

STOP condition:

SCLK: ____|--------------
		     
SDIO:____________|-------
		1 |  2        | 3

DATA:

SCLK:_______________|---|________|----|_______
		     
SDIO:___________|------------|____________|----
				|<======= >|


RESET:

SENB:__|---------------------------------------------
SDIO:_________________________________________|------
RST:  ___________|------------------------------------
SCLK:__|---------------------------------------------
	     |	  1		|			2				    |   3

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

#define DURATION_INIT_1 	        600ns mininum
#define DURATION_INIT_2	                600ns minimum
#define DURATION_INIT_3 	        600ns minimum

#define DURATION_START_1	        600ns minimum
#define DURATION_START_2	        600ns minimum
#define DURATION_START_3	        800ns minimum

#define DURATION_STOP_1	                800ns minimum
#define DURATION_STOP_2	                600ns minimum
#define DURATION_STOP_3	                1300ns minimum
					
#define DURATION_HIGH		        900ns minimum
#define DURATION_LOW		        1600ns minimum

#define POWER_SETTLING		        50~100ms

//#define DELAY(DURATION)		{unsigned short i; for(i = 1; i <= DURATION; i++){}}

#define READ		                1
#define WRITE	                        0


void ResetSi4700_2w(void)
{
	SDIO_DIR = OUT;
	SENB = 1;
	SDIO = 0;
	RST = 0;
	SCLK = 1;
	DELAY(DURATION_INIT_1);
	RST = 1;
	DELAY(DURATION_INIT_2);
	SDIO = 1;
	DELAY(DURATION_INIT_3);
	
}

unsigned char OperationSi4700_2w(unsigned char 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 = 1;
	SDIO = 1;
	DELAY(DURATION_START_1);
	SDIO = 0;
	DELAY(DURATION_START_2);
	SCLK = 0;
	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--)
	{
		SDIO = (controlWord >> i) & 0x01;
		DELAY(DURATION_LOW/2);
		SCLK = 1;
		DELAY(DURATION_HIGH);
		SCLK = 0;
		DELAY(DURATION_LOW/2);
	}

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

CHECK ACK for control word

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

	SDIO_DIR = IN;

	DELAY(DURATION_LOW/2);
	SCLK = 1;
	DELAY(DURATION_HIGH);	
	if(SDIO != 0)
	{
		error = 1;
		goto STOP;
	}
        SCLK = 0;
	DELAY(DURATION_LOW/2);

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

WRITE or READ data

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


	for(j = 0; j < numBytes; j++, data++)
	{
		if(operation == WRITE)
			SDIO_DIR = OUT; 
		else
<input type="image" src="">			SDIO_DIR = IN;
		
		for(i = 7; i>=0; i--)
		{
			if(operation == WRITE)
				SDIO = (*data >> i) & 0x01;
			DELAY(DURATION_LOW/2);
			SCLK = 1;
			DELAY(DURATION_HIGH);
                        if(operation == READ)
				*data = (*data << 1) | SDIO;
			SCLK = 0;
			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 = 1;
			else
				SDIO = 0;
		}
		DELAY(DURATION_LOW/2);
		SCLK = 1;
		DELAY(DURATION_HIGH);
		if(operation == WRITE)
			if(SDIO != 0)
			{
				error = 1;
				goto STOP;
			}
        	SCLK = 0;
		DELAY(DURATION_LOW/2);
	}
	

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

STOP: make sure here: SCLK = 0

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

	STOP:

	SDIO_DIR = OUT;
	SDIO = 0;
	DELAY(DURATION_STOP_1);
	SCLK = 1;
	DELAY(DURATION_STOP_2);
	SDIO = 1;
	DELAY(DURATION_STOP_3);

	return(error);

}



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

Si4700_Intialization():
after initialization please make sure:
0x00: 0x1242
0x01: 0x0800/0850
0x07: 0x3c04
0x08: 0x00ff
0x09: 0x0001

***************************************/
void Si4700_Intialization(void)
{
	unsigned char si4700_initialization[] = {0x40,0x01,0x00,0x00,0xC0,0x04,0x0f,0x1f};
	unsigned char error_ind = 0;

	
	ResetSi4700_2w();

	error_ind = OperationSi4700_2w(WRITE, &(si4700_initialization[0]), 8);
	if(error_ind)
		return;

	DELAY(POWER_SETTLING);	
}

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

Si4700_Channel_Selection()

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

void Si4700_Channel_Selection(void)
{
	unsigned short loop_counter = 0;
	unsigned char si4700_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char si4700_channel_start_tune[]= {0x40,0x01,0x80,0xCA};	//107.7MHz
	unsigned char si4700_channel_stop_tune[] = {0x40,0x01,0x00};	

	//set tune bit
 	error_ind = OperationSi4700_2w(WRITE, &(si4700_channel_start_tune[0]), 4);
	if(error_ind)
		return;

	//wait STC=1
	do
	{	
		error_ind = OperationSi4700_2w(READ, &(si4700_reg_data[0]), 1);
		if(error_ind)
			return;	
		loop_counter++;
	}
	while(((si4700_reg_data[0]&0x40) == 0) && (loop_counter < 0xffff));		
	loop_counter = 0;

	//clear tune bit
	error_ind = OperationSi4700_2w(WRITE, &(si4700_channel_stop_tune[0]), 3);
	if(error_ind)
		return;		

	//wait STC=0
	do
	{	
		error_ind = OperationSi4700_2w(READ, &(si4700_reg_data[0]), 1);
		if(error_ind)
			return;	
	loop_counter++;
	}
	while(((si4700_reg_data[0]&0x40) != 0) && (loop_counter < 0xffff));		
	loop_counter = 0;

	//read REG0A&0B
	error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 4);	
	if(error_ind)
		return;	
	

}

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

Si4700_Channel_Seek()
return 1: I2C error 
return 2: seek fail

***************************************/
unsigned char Si4700_Channel_Seek(void)

{
	unsigned short loop_counter = 0;
	unsigned char si4700_reg_data[32];
	unsigned char error_ind = 0, seek_error = 0;
	unsigned char si4700_channel_seek_start[] = {0x41};
	unsigned char si4700_channel_seek_stop[] = {0x40};

	//set seek bit
 	error_ind = OperationSi4700_2w(WRITE,&(si4700_channel_seek_start[0]), 1);
	if(error_ind)
		return 1;

	//wait STC=1
	do
	{	
		error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 1);
		if(error_ind)
			return 1;	
		loop_counter++;
	}
	while(((si4700_reg_data[0]&0x40) == 0) && (loop_counter < 0xffff));		
	loop_counter = 0;

	//check whether SF=1
	if((si4700_reg_data[0]&0x20) != 0)
		seek_error = 2;

	//clear seek bit
	error_ind = OperationSi4700_2w(WRITE,&(si4700_channel_seek_stop[0]), 1);
	if(error_ind)
		return 1;	

	//wait STC=0
	do
	{	
		error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 1);
		if(error_ind)
			return 1;	
		loop_counter++;
	}
	while(((si4700_reg_data[0]&0x40) != 0) && (loop_counter < 0xffff));		
	loop_counter = 0;

	//read REG0A&0B
	error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 4);	
	if(error_ind)
		return 1;	

	return seek_error;

}







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: an332_si47xxexamplecode.zip是一个包含Si47xx系列收音芯片的示例代码的压缩文件。Si47xx是一款集成了调谐器和数字信号处理功能的收音机芯片,可以用于接收AM、FM和短波广播信号。 这个示例代码文件提供了一些使用Si47xx芯片的演示程序,用于帮助开发者快速理解和使用Si47xx芯片。这些示例程序以C语言编写,提供了各种功能,如频道扫描、频率调谐、音量控制等。 使用an332_si47xxexamplecode.zip文件时,首先需要将其解压缩。解压后可以找到不同的示例代码文件,每个文件都是一个完整的独立程序。开发者可以根据自己的需求选择合适的示例代码,并根据自己的项目进行修改和调整。 为了使用这些示例代码,开发者需要将Si47xx芯片与自己的硬件连接,并根据示例代码的要求进行配置。配置完成后,可以编译并下载示例代码到Si47xx芯片上运行。通过观察示例代码的运行结果,开发者可以了解Si47xx芯片的各种功能和使用方法,并在自己的项目中进行相应的开发和调试。 总之,an332_si47xxexamplecode.zip文件提供了Si47xx收音芯片的示例代码,可以帮助开发者快速上手并使用Si47xx芯片的功能。通过使用这些示例代码,开发者可以更好地理解和应用Si47xx芯片,从而使其在收音机项目中发挥出更大的作用。 ### 回答2: an332_si47xxexamplecode.zip是一个压缩文件,其中包含了一个示例代码的项目。这个项目是基于si47xx系列芯片的,si47xx芯片是一种具有无线收发功能的集成电路芯片。 该示例代码的目的是展示如何使用si47xx芯片进行无线电接收和发送操作。该代码可能包含以下内容: 1. 初始化代码:这部分代码用于初始化si47xx芯片,设定无线电接收和发送的相关参数。 2. 接收代码:这部分代码用于实现无线电接收功能,可以接收不同频率上的广播电台、电视信号等。示例代码可能包含设置接收频率、调节音量、切换音频模式等功能。 3. 发送代码:这部分代码用于实现无线电发送功能,可以发送特定频率上的音频信号。示例代码可能包含设置发送频率、音频输入源选择、发送音频等功能。 通过阅读这些示例代码,可以学习到如何使用si47xx芯片进行无线电操作,了解其相关API函数和命令,进一步掌握无线电通信技术。 请注意,这些示例代码可能需要在特定的开发环境中进行编译和运行,具体操作步骤可能需要参考压缩文件中的文档或开发者手册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值