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

📄 spidrv8548.c

📁 MPC8548上用GPIO口模拟的SPI控制器.包括初始化,单字节读写,多字节读写等等.调试通过
💻 C
📖 第 1 页 / 共 3 页
字号:
/*=============================================================
*	Copyright (c) 2008~2010, CPIT. All Rights Reserved.
*
*	MODULE:  ecpb8548  模拟spi 
*
*	FILENAME: spiDrv8548.c
*
*	DESCRIPTION: 用mpc8548 的gpio 模拟spi  的初始化,读写功能
*
*

*	HISTORY:
*
*	Date           CR No      Person        Description
*	----------  ------------  ------       -------------
*	2008-12-01                litao       created.
*

=============================================================*/




#include "vxWorks.h"
#include "sysLib.h"
#include "stdio.h"
#include "semLib.h" 
#include "taskLib.h"
#include "../../../comm_drv/nbDrvDef.h"
#include "../../../comm_drv/nbdrvcommintf.h"
#include"../inc/spiDrv8548.h"

IMPORT UINT32 vxImmrGet();
LOCAL void spi_slave_sel(SpiType sel, INT32 flag);
LOCAL void spi_write_byte(SpiType sel, UINT8 data);
LOCAL void spi_read_byte(SpiType sel, UINT8 *buffer);


LOCAL SYS_STATUS bcm5387_poll_spif();
LOCAL SYS_STATUS bcm5387_poll_rack(UINT8 mode);
LOCAL SYS_STATUS bcm5387_poll_rxrdy();
LOCAL SYS_STATUS bcm5387_poll_txrdy();
LOCAL SYS_STATUS bcm5387_read_bytes(UINT8 bytes, UINT8 * buffer_ptr);
LOCAL SYS_STATUS bcm5387_write_bytes(UINT8 bytes, UINT8 * buffer_ptr);
LOCAL void bcm5387_write_new_page(UINT8 page);

/*#define REVS16(x)  (UINT16)((((x) & 0xff00) >> 8 ) |(((x)&0x00ff)<<8))*/


/*AD9516 的配置数据*/

RegValve default_config_9516[75] =  
{

    {0x0000,0x99},/*0x99*/

    {0x0001,0x00},

    {0x0002,0x10},

    {0x0003,0xC3},

    {0x0004,0x00},

    {0x0010,0x7c},/*0x7d*/

    {0x0011,0x02},

    {0x0012,0x00},

    {0x0013,0x00},

    {0x0014,0x09},

    {0x0015,0x00},

    {0x0016,0x05},

    {0x0017,0xb4},/*0xF4*/

    {0x0018,0x07},/*0x06*/

    {0x0019,0x00},

    {0x001A,0x00},

    {0x001B,0xA1},/*0x210x30*/

    {0x001C,0xAE},/*2A*/

    {0x001D,0x00},

    {0x001E,0x00},

    {0x001F,0x00},/*0x0E*/

    {0x00A0,0x01},

    {0x00A1,0x00},

    {0x00A2,0x00},

    {0x00A3,0x01},

    {0x00A4,0x00},

    {0x00A5,0x00},

    {0x00A6,0x01},

    {0x00A7,0x00},

    {0x00A8,0x00},

    {0x00A9,0x01},

    {0x00AA,0x00},

    {0x00AB,0x00},

    {0x00F0,0x08},

    {0x00F1,0x08},

    {0x00F2,0x08},

    {0x00F3,0x08},

    {0x00F4,0x08},

    {0x00F5,0x08},

    {0x0140,0x42},

    {0x0141,0x42},

    {0x0142,0x42},

    {0x0143,0x43},

    {0x0190,0x22},

    {0x0191,0x00},

    {0x0192,0x00},

    {0x0193,0x22},

    {0x0194,0x00},

    {0x0195,0x00},

    {0x0196,0x22},

    {0x0197,0x00},

    {0x0198,0x00},

    {0x0199,0x10},

    {0x019A,0x00},

    {0x019B,0x11},

    {0x019C,0x20},

    {0x019D,0x00},

    {0x019E,0x10},

    {0x019F,0x00},

    {0x01A0,0x00},

    {0x01A1,0x20},

    {0x01A2,0x00},

    {0x01A3,0x00},

    {0x01E0,0x02},

    {0x01E1,0x02},

    {0x0230,0x00},

    {0x0231,0x00},

    {0x0232,0x00},

    {0x0232,0x01},

    {0x0018,0x06},

    {0x0232,0x01},

    {0x0018,0x07},

{0x0232,0x01},

};   



/**************************************************************************
*
*   Function Name: spi_delay
*
*   Description: delay api.
*      
*
*   Input(s):
*       ns15:num;
*
*   Output(s):
*       none.
*
*   Returns:
*       none.
*
*************************************************************************/

void spi_delay(VUINT32 ns15)
{
	UINT32 i;
	ns15=ns15/10;
	for (i=0; i<ns15; i++)
	{
		;
	}
	return;
}  

/*------------------------------------------------------------------------------
*
*	Function Name: spi_init
*
*	Input(s):
*		<none>
*
*	Output(s):
*		<none>
*
*	Returns:
*		NB_DRV_OK: 初始化成功
*		NB_DRV_ERROR:初始化失败
*
*	Description:
*	 初始化MPC8548 的GPIO,配置模拟的SPI 
*
------------------------------------------------------------------------------*/
SYS_STATUS spi_init()
{
	UINT32 immr_val = /*vxImmrGet()*/0x80000000;
	*M85XX_DEVDISR(immr_val) |= ETSEC2_DISABLE;
	printf("\nEth-2 disable:M85XX_DEVDISR is %x\n",*M85XX_DEVDISR(immr_val));
	*M85XX_GPIOCR(immr_val) |= (TX2OUT | RX2IN | PCIOUT |PCIIN);/*set gpio control reg*/

	spi_slave_sel(SPI_SEC_AD9516,0);
	/*config AD9516*/
	/*if(NB_DRV_OK != ad9516_init())
	{
		return NB_DRV_ERROR;
	}*/
	return NB_DRV_OK;
}

/*------------------------------------------------------------------------------
*
*	Function Name: spi_slave_sel
*
*	Input(s):
*		UINT32 sel:目标设备类型
*		INT32 flag:1-选通,2-不选通
*
*	Output(s):
*		<none>
*
*	Returns:
*		
*
*	Description:
*	  选择SPI 的目标设备,设置片选。
*
------------------------------------------------------------------------------*/

LOCAL void spi_slave_sel(SpiType sel, INT32 flag)
{
    UINT32 cs_val = 0;
    UINT32 immr_val = /*vxImmrGet()*/0x80000000;    

    cs_val = *M85XX_GPOUTDR(immr_val);    
    /*片选为0选上,为1不选*/
    if(flag)
    {
	    if(SPI_SEC_BCM5387 == sel)
	    {
	        cs_val |= CS_AD9516;
	        cs_val &= (~CS_BCM5387);    
	    }
	    else
	    {
	        cs_val |= CS_BCM5387;
	        cs_val &= (~CS_AD9516); 
	    }
    }
    else
    {
	    cs_val |= (CS_AD9516 | CS_BCM5387);
    }
    *M85XX_GPOUTDR(immr_val) = cs_val;
    spi_delay(30);
    return;

}


/*------------------------------------------------------------------------------
*
*	Function Name: spi_write_byte
*
*	Input(s):
*		UINT32 sel:目标设备类型
*            SpiType data:数据
*
*	Output(s):
*		<none>
*
*	Returns:
*		
*
*	Description:
*	  gpio 模拟的spi 写1 byte 的数据
*
------------------------------------------------------------------------------*/

LOCAL void spi_write_byte(SpiType sel, UINT8 data)
{
	UINT8 i;
	UINT32 immr_val = /*vxImmrGet()*/0x80000000;
#if 0
	spi_slave_sel(sel,1);/*select cs*/
#endif	
	for(i=0;i<8;i++) /*发送8位数据*/
	{
		*M85XX_GPOUTDR(immr_val) &=(~SPI_SCLK); 
		spi_delay(200);
		if((data&0x80)!=0) 
		{
			*M85XX_GPOUTDR(immr_val)  |= SPI_MOSI;
		}
		else
		{
		     *M85XX_GPOUTDR(immr_val)  &= (~SPI_MOSI);
		}
		spi_delay(200);
		data <<= 1;
		*M85XX_GPOUTDR(immr_val)  |= SPI_SCLK; /*SPI_CLK=1*/
		spi_delay(300);
	}

/*	*M85XX_GPOUTDR(immr_val) &=(~SPI_SCLK); 	*/
/*	spi_delay(200);*/
#if 0
	spi_slave_sel( sel,0);/*select cs*/
#endif
/*	spi_delay(300);*/
	return;

}

/*------------------------------------------------------------------------------
*
*	Function Name: spi_read_byte
*
*	Input(s):
*		SpiType sel:目标设备类型
*            UINT8 *buffer: 读数据的指针
*
*	Output(s):
*		UINT8 *buffer:读到的数据
*
*	Returns:
*		
*
*	Description:
*	  gpio 模拟的spi 读1 byte 的数据
*
------------------------------------------------------------------------------*/

void spi_read_byte(SpiType sel,UINT8 *buffer)
{
	UINT8 i;
	UINT8 tempdata = 0;
	UINT32 data = 0;
	UINT32 immr_val = /*vxImmrGet()*/0x80000000;

	*(UINT8 *)buffer  = 0x0;
#if 0
	spi_slave_sel( sel,1);/*select cs*/
#endif
	for(i=0;i<8;i++) /*接收8 位数据*/
	{
		*M85XX_GPOUTDR(immr_val) &=(~SPI_SCLK); /*SPI_CLK=0*/
		spi_delay(200);
		data = (*M85XX_GPINDR(immr_val)) & SPI_MISO;
		if(data)
		{
			tempdata=(0x01 << (7-i));
		}
		else
		{
			tempdata=0x0;
		}
		spi_delay(200);
		*buffer |= tempdata;
		*M85XX_GPOUTDR(immr_val)|=SPI_SCLK; /*SPI_CLK=1*/
		spi_delay(300);
		tempdata = 0;
	}

/*	*M85XX_GPOUTDR(immr_val) &=(~SPI_SCLK); */
#if 0	
	spi_delay(200);
	
	spi_slave_sel( sel,0);/*select cs*/
#endif
/*	spi_delay(300);*/
	return;

}




/*------------------------------------------------------------------------------
*
*	Function Name: spi_read
*
*	Input(s):
*		 SpiType aim_type;模拟的SPI目标设备的类型
*            UINT16 data_addr:目标设备的偏移地址
*            UINT16 read_len:读数据的长度
*            UINT8 *recv_data_ptr:读数据存放的指针
*
*	Output(s):
*            UINT8 *recv_data_ptr:读到的数据
*
*	Returns:
*		 NB_DRV_OK:
*            NB_DRV_ERROR:
*
*	Description:
*	   通过模gpio 模拟的spi 读目标设备的数据
*
------------------------------------------------------------------------------*/

SYS_STATUS spi_read(SpiType aim_type, UINT16 data_addr, UINT16 read_len, UINT8 *recv_data_ptr)
{
	#ifdef SPI_DRV_DEBUG
		printf("\r\spi_read:aim_type = %d, data_addr = %d,read_len = %d...recv_data_ptr = 0x%x\n", aim_type, data_addr, read_len,*recv_data_ptr);
	#endif

	if((NULL == recv_data_ptr) || (aim_type >= SPI_SEC_NONE))
	{
		return NB_DRV_ERROR;
	}    

	switch(aim_type)
	{
	#if 0
		case SPI_SEC_BCM5387:
			if(NB_DRV_OK != bcm5387_read( (UINT8)read_len, recv_data_ptr))
			{
				return NB_DRV_ERROR;
			}
			break;
#endif
		/*ad9516 操作*/  
		case SPI_SEC_AD9516:
			if(NB_DRV_OK != ad9516_read(data_addr, (UINT8)read_len, recv_data_ptr))
			{
				return NB_DRV_ERROR;
			}
			break;  
		default:
			return NB_DRV_ERROR;
	}
	
	return NB_DRV_OK;

}


/*------------------------------------------------------------------------------
*
*	Function Name: spi_write
*
*	Input(s):
*		 SpiType aim_type;模拟的SPI目标设备的类型
*            UINT16 data_addr:目标设备的偏移地址
*            UINT16 read_len:写数据的长度
*            UINT8 *recv_data_ptr:写数据存放的指针
*
*	Output(s):
*           <none>
*
*	Returns:
*		NB_DRV_OK:
*           NB_DRV_ERROR:	
*
*	Description:
*	   通过模gpio 模拟的spi 读目标设备的数据
*
------------------------------------------------------------------------------*/

SYS_STATUS spi_write(SpiType aim_type,  UINT16 data_addr, UINT16 write_len, UINT8 *send_data_ptr)
{
	#ifdef SPI_DRV_DEBUG
		printf("\r\nspi_write:aim_type = %d, data_addr = %d,write_len = %d...send_data_ptr = 0x%x\n", aim_type, data_addr, write_len,*send_data_ptr);
	#endif

	if((NULL == send_data_ptr) || (aim_type >= SPI_SEC_NONE))
	{
		return NB_DRV_ERROR;
	}

	switch(aim_type)
	{
		case SPI_SEC_BCM5387:
		#if 0
			if(NB_DRV_OK != bcm5387_write((UINT8)write_len, send_data_ptr))
			{
				return NB_DRV_ERROR;
			}
			break;
		#endif
		/*ad9516 操作*/    
		case SPI_SEC_AD9516:
			if(NB_DRV_OK != ad9516_write(data_addr, (UINT8)write_len, send_data_ptr))
			{
				return NB_DRV_ERROR;
			}

⌨️ 快捷键说明

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