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

📄 spidrv8548.c

📁 MPC8548上用GPIO口模拟的SPI控制器.包括初始化,单字节读写,多字节读写等等.调试通过
💻 C
📖 第 1 页 / 共 3 页
字号:
			break;
		default:
			return NB_DRV_ERROR;
	}
	return NB_DRV_OK;
}




/*------------------------------------------------------------------------------
*
*	Function Name: ad9516_write
*
*	Input(s):
*             UINT16 addr:
*             UINT8 byte_cnt:
*             UINT8 *pdata:
*
*	Output(s):
*		<none>
*
*	Returns:
*		NB_DRV_OK:
*            NB_DRV_ERROR:
* 
*	Description:
*	   ad9516 的寄存器读写
*        R/W | W1 | W0 | A12...A0 | Dn....D0|
*
------------------------------------------------------------------------------*/

SYS_STATUS ad9516_read(UINT16 addr, UINT8 byte_cnt, UINT8 *pbuffer)
{
	UINT32 i = 0;
	UINT8 cmd_h = 0;
	UINT8 cmd_l= 0;

	if((MAX_BYTE_CNT < byte_cnt) ||(NULL == pbuffer)
			||(AD9516_ADDR_LEN < addr))
	{
		return NB_DRV_ERROR;
	}    

	cmd_h = (UINT8)(0x80 |(addr>>8));/*R/W bit set to 1*/
	cmd_l = (UINT8)addr;
	/*select slave device*/
	spi_slave_sel(SPI_SEC_AD9516, 1);
	spi_write_byte(SPI_SEC_AD9516, cmd_h);	
	spi_slave_sel(SPI_SEC_AD9516, 0);

	spi_slave_sel(SPI_SEC_AD9516, 1);
	spi_write_byte(SPI_SEC_AD9516, cmd_l);
	spi_slave_sel(SPI_SEC_AD9516, 0);

	/*read data from ad9516*/
	for(i=0; i < byte_cnt; i++)
	{
		spi_slave_sel(SPI_SEC_AD9516, 1);
		spi_read_byte(SPI_SEC_AD9516, pbuffer);
		spi_slave_sel(SPI_SEC_AD9516, 0);
		pbuffer++;
	}	
	return NB_DRV_OK;
}



/*------------------------------------------------------------------------------
*
*	Function Name: ad9516_write
*
*	Input(s):
*             UINT16 addr:
*             UINT8 byte_cnt:
*             UINT8 *pdata:
*
*	Output(s):
*		<none>
*
*	Returns:
*		NB_DRV_OK:
*            NB_DRV_ERROR:
* 
*	Description:
*	   ad9516 的寄存器读写
*        R/W | W1 | W0 | A12...A0 | Dn....D0|
------------------------------------------------------------------------------*/

SYS_STATUS ad9516_write(UINT16 addr, UINT8 byte_cnt, UINT8 *pdata)
{
	UINT32 i = 0;
	UINT8 cmd_h = 0;
	UINT8 cmd_l= 0;

#ifdef SPI_DRV_DEBUG
	printf("\r\nspi_write:addr = %d,byte_cnt = %d...", addr, byte_cnt);
#endif
	if((MAX_BYTE_CNT < byte_cnt) ||(NULL == pdata)
				||(AD9516_ADDR_LEN < addr))
	{
		return NB_DRV_ERROR;
	}

	cmd_h = (UINT8 )((addr>>8) & 0x0f);
	cmd_l = (UINT8 )addr;
	/*select slave device*/
	spi_slave_sel(SPI_SEC_AD9516, 1);
	spi_write_byte(SPI_SEC_AD9516, cmd_h);
	spi_slave_sel(SPI_SEC_AD9516, 0);

	spi_slave_sel(SPI_SEC_AD9516, 1);
	spi_write_byte(SPI_SEC_AD9516, cmd_l);
	spi_slave_sel(SPI_SEC_AD9516, 0);
	for(i=0; i < byte_cnt; i++)
	{
		spi_slave_sel(SPI_SEC_AD9516, 1);
		spi_write_byte(SPI_SEC_AD9516, *pdata);
		spi_slave_sel(SPI_SEC_AD9516, 0);
		pdata++;
	}
	return NB_DRV_OK;
}


/*------------------------------------------------------------------------------
*
*	Function Name: ad9516_init
*
*	Input(s):
*             <none>
*            
*            
*
*	Output(s):
*		<none>
*
*	Returns:
*		NB_DRV_OK:
*            NB_DRV_ERROR:
* 
*	Description:
*	   配置ad9516 的寄存器
*        
------------------------------------------------------------------------------*/

SYS_STATUS ad9516_init(void)
{
	UINT16 i;
	UINT16 count = 0;
	RegValve *data_ptr = NULL;

	*(UINT8 *)0xf002000f=0xb;

	data_ptr = &default_config_9516[0];
	count = sizeof(default_config_9516)/sizeof(RegValve);       

	for( i=0; i<count; i++)
	{
		if(NB_DRV_OK != spi_write(SPI_SEC_AD9516, data_ptr->RegAddr, AD9516_REG_OP,(UINT8 *)&(data_ptr->RegVal)))
		{
			return NB_DRV_ERROR;
		}
		data_ptr ++;
		taskDelay(1); 
	} 
	taskDelay(1);  

	return NB_DRV_OK;

}



/*------------------------------------------------------------------------------
*
*	Function Name: bcm5387_read_half
*
*	Input(s):
*             UINT8 addr:
*             UINT8 byte_cnt:
*             UINT8 *pdata:
*
*	Output(s):
*		<none>
*
*	Returns:
*		NB_DRV_OK:
*            NB_DRV_ERROR:
* 
*	Description:
*	   <CMD, CHIP ID, R><REG ADDR>
*       CHIP ID = 000,R = 0, W = 1
*       Normal SPI:0110|CHIP ID2|CHIP ID1|CHIP ID0|R/W|
------------------------------------------------------------------------------*/
#if 0
SYS_STATUS bcm5387_read( UINT8 page, UINT8 reg_addr, UINT8 byte_cnt, UINT8 *pbuffer)
{
	UINT32 i=0; 
	UINT32 j=0;
	UINT8 dummy=0;
	UINT8 u8temp=0;
	UINT32 time_out;
	*pbuffer=0;
	UINT32 immr_val = /*vxImmrGet()*/0x80000000;


	if((MAX_BYTE_CNT < byte_cnt) ||(NULL == pbuffer))
	{
		return NB_DRV_ERROR;
	}

/*	*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
	spi_delay(200);
	spi_slave_sel(SPI_SEC_BCM5387, 1);*/
#if 0	

#if 1	
	for(time_out=100; time_out>0; time_out--)
	{
/*		*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
		spi_delay(200);*/
		spi_slave_sel(SPI_SEC_BCM5387, 1);
		
		spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);
		spi_write_byte(SPI_SEC_BCM5387, 0xfe);
		spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);
		
		spi_slave_sel(SPI_SEC_BCM5387, 0);
		if(!(u8temp & (UINT8)0x80))
		{
			break;
		}
		/*spi_delay(200);*/
		
	}

	if(!time_out)
	{
		printf("Time out for get SPIF");
		spi_slave_sel(SPI_SEC_BCM5387, 0);

		return ERROR;
	}
#endif
	/*spi_slave_sel(SPI_SEC_BCM5387, 0);*/


/*	*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
	spi_delay(200);*/
	spi_slave_sel(SPI_SEC_BCM5387, 1);
	/*first: write new page */
	
	spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_WRITE_PACKET);
	spi_write_byte(SPI_SEC_BCM5387, 0xff);
	spi_write_byte(SPI_SEC_BCM5387, page);

	spi_slave_sel(SPI_SEC_BCM5387, 0);

/*	*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
	spi_delay(200);*/
	spi_slave_sel(SPI_SEC_BCM5387, 1);

	/*next: read a dummy value*/
	spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);
	spi_write_byte(SPI_SEC_BCM5387, reg_addr);
	spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&dummy);

	spi_slave_sel(SPI_SEC_BCM5387, 0);

	printf("\ndummy is %x\n",dummy);
	
	for(i=0;i<=byte_cnt/4;i++)
	{
		if((i == (byte_cnt/4)) && (0!=i))
		{
			for(j=0; j<(byte_cnt % 4); j++)
			{
				for(time_out=100; time_out>0; time_out--)
				{
				/*	*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
					spi_delay(200);*/
					spi_slave_sel(SPI_SEC_BCM5387, 1);
					
					spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);
					spi_write_byte(SPI_SEC_BCM5387, 0xfe);
					spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);

					spi_slave_sel(SPI_SEC_BCM5387, 0);
					if(u8temp & (UINT8)0x20)
					{
						break;
					}
					/*spi_delay(200);*/
					
				};

				if(!time_out)
				{
					printf("\nTime out for get RACK\n");
					spi_slave_sel(SPI_SEC_BCM5387, 0);
					return ERROR;
				}

/*				*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
				spi_delay(200);*/
				spi_slave_sel(SPI_SEC_BCM5387, 1);
				/*forth: Read the data from the SPI Data I/O register*/
				spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);

				spi_write_byte(SPI_SEC_BCM5387, 0xf0);

				spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);

				*pbuffer |= u8temp;

				spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);
				*pbuffer |= (((UINT16)u8temp & 0xff) <<8);

				spi_slave_sel(SPI_SEC_BCM5387, 0);

				pbuffer++;

				
			}
		}
		else
		{
			for(j=0;j<4;j++)
			{
				
				for(time_out=100; time_out>0; time_out--)
				{
/*					*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
					spi_delay(200);*/
					spi_slave_sel(SPI_SEC_BCM5387, 1);
					
					spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);
					spi_write_byte(SPI_SEC_BCM5387, 0xfe);
					spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);

					spi_slave_sel(SPI_SEC_BCM5387, 0);
					if(u8temp & (UINT8)0x20)
					{
						break;
					}
					/*spi_delay(200);*/
					
				};

				if(!time_out)
				{
					printf("\nTime out for get RACK\n");
					spi_slave_sel(SPI_SEC_BCM5387, 0);
					return ERROR;
				}
				

/*				*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
				spi_delay(200);*/
				spi_slave_sel(SPI_SEC_BCM5387, 1);

				/*forth: Read the data from the SPI Data I/O register*/
				spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);

				spi_write_byte(SPI_SEC_BCM5387, 0xf0);

				spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);

				*pbuffer |= u8temp;

				spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);
				*pbuffer |= (((UINT16)u8temp & 0xff) <<8);
				spi_slave_sel(SPI_SEC_BCM5387, 0);

				pbuffer++;
			}
		}
		for(time_out=100; time_out>0; time_out--)
		{
/*			*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; 
			spi_delay(200);*/
			spi_slave_sel(SPI_SEC_BCM5387, 1);

			
			spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);
			spi_write_byte(SPI_SEC_BCM5387, 0xfe);
			spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);
			spi_slave_sel(SPI_SEC_BCM5387, 0);
			if(u8temp & (UINT8)0x02)
			{
				break;
			}
			/*spi_delay(200);*/
			
		};

		if(!time_out)
		{
			printf("\nTime out for get RxRdy\n");
			spi_slave_sel(SPI_SEC_BCM5387, 0);
			return ERROR;
		}
	}
	/*spi_slave_sel(SPI_SEC_BCM5387, 0);*/
#endif

#if 1/*fast mode*/
	
	for(time_out=100; time_out>0; time_out--)
	{
		spi_slave_sel(SPI_SEC_BCM5387, 1);
		
		spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);
		spi_write_byte(SPI_SEC_BCM5387, 0xfe);
		spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);
		
		spi_slave_sel(SPI_SEC_BCM5387, 0);
		if(!(u8temp & (UINT8)0x80))
		{
			break;
		}
		/*spi_delay(200);*/
		
	}

	if(!time_out)
	{
		printf("Time out for get SPIF");
		
		spi_slave_sel(SPI_SEC_BCM5387, 1);
		/*first: write new page */
		
		spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_WRITE_PACKET);
		spi_write_byte(SPI_SEC_BCM5387, 0xff);
		spi_write_byte(SPI_SEC_BCM5387, page);

		spi_slave_sel(SPI_SEC_BCM5387, 0);

		return ERROR;
	}

	printf("\n1\n");

	spi_slave_sel(SPI_SEC_BCM5387, 1);
	/*first: write new page */
	
	spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_WRITE_PACKET);
	spi_write_byte(SPI_SEC_BCM5387, 0xff);
	spi_write_byte(SPI_SEC_BCM5387, page);

	spi_slave_sel(SPI_SEC_BCM5387, 0);

	for(i=0;i<byte_cnt;i++)
	{
		if((i!=0) && (i%8==0))
		{
			for(time_out=100;time_out>0;time_out--)
			{
				spi_slave_sel(SPI_SEC_BCM5387, 1);
				spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_READ_PACKET);
				spi_write_byte(SPI_SEC_BCM5387, 0xfe);
				spi_read_byte(SPI_SEC_BCM5387, (UINT8*)&u8temp);
				spi_slave_sel(SPI_SEC_BCM5387, 0);

				if(u8temp& (UINT8)0x02)
				{
					break;
				}
			}
			if(!time_out)
			{
				printf("\nCannot get RXRDY!!\n");
				return ERROR;
			}
		}

		if(i%8==0)
		{
			printf("\n2\n");
			spi_slave_sel(SPI_SEC_BCM5387, 1);
	
			spi_write_byte(SPI_SEC_BCM5387, 0x10);
			spi_write_byte(SPI_SEC_BCM5387, reg_addr);
			for(time_out=100;time_out>0;time_out--)
			{
				spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);
				if(u8temp & (UINT8)0x01)
				{
					break;
				}
			}

			if(!time_out)
			{
				printf("\nTime out for get RACK\n");
				return ERROR;
			}
		}
		spi_read_byte(SPI_SEC_BCM5387, pbuffer);
		pbuffer++;
		if(i%8==0)
		{
			spi_slave_sel(SPI_SEC_BCM5387, 0);
		}
		printf("\n3\n");
	}
#if 0
	spi_slave_sel(SPI_SEC_BCM5387, 1);
	
	spi_write_byte(SPI_SEC_BCM5387, 0x10);
	spi_write_byte(SPI_SEC_BCM5387, reg_addr);
	for(time_out=100;time_out>0;time_out--)
	{
		spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);
		if(u8temp & (UINT8)0x01)
		{
			break;
		}
	}

	if(!time_out)
	{
		printf("\nTime out for get RACK\n");
		return ERROR;
	}

#if 0	
	spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);

	*pbuffer |= u8temp;

	spi_read_byte(SPI_SEC_BCM5387, (UINT8 *)&u8temp);
	*pbuffer |= (((UINT16)u8temp & 0xff) <<8);

	spi_slave_sel(SPI_SEC_BCM5387, 0);
#endif
	for(i=0;i<byte_cnt;i++)
	{
		spi_read_byte(SPI_SEC_BCM5387, pbuffer);
		pbuffer++;
	}
	spi_slave_sel(SPI_SEC_BCM5387, 0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -