📄 spidrv8548.c
字号:
/*=============================================================
* 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 + -