📄 spidrv8548.c
字号:
#endif
#endif
return NB_DRV_OK;
}
#endif
SYS_STATUS bcm5387_read( UINT8 page, UINT8 reg_addr, UINT8 byte_cnt, UINT8 *pbuffer)
{
UINT32 i;
UINT8 *local_buffer=pbuffer;
UINT8 local_reg_addr=reg_addr;
UINT32 time_out;
for(time_out=3;time_out>0;time_out--)
{
if(OK != bcm5387_poll_spif())
{
bcm5387_write_new_page(page);
}
else
{
break;
}
}
if(!time_out)
{
printf("\nCannot get SPIF!!!\n");
return ERROR;
}
bcm5387_write_new_page(page);
if(byte_cnt <=8)
{
for(i=0;i<byte_cnt;i++)
{
spi_slave_sel(SPI_SEC_BCM5387, 1);
/*fast mode*/
spi_write_byte(SPI_SEC_BCM5387, 0x10);
spi_write_byte(SPI_SEC_BCM5387, reg_addr);
if(OK != bcm5387_poll_rack(1))
{
printf("\nbcm5387_read:cannot get RACK\n");
return ERROR;
}
bcm5387_read_bytes(byte_cnt,pbuffer);
spi_slave_sel(SPI_SEC_BCM5387, 0);
}
}
else
{
for(i=0;i<=byte_cnt/8;i++)
{
if(0 != i)
{
if(OK != bcm5387_poll_rxrdy())
{
printf("bcm5387_read:cannot get RXRDY");
/*return ERROR;*/
}
}
if(i != (byte_cnt/8))
{
local_reg_addr=reg_addr+i*8;
local_buffer = pbuffer+byte_cnt-(i+1)*8;
spi_slave_sel(SPI_SEC_BCM5387, 1);
/*fast mode*/
spi_write_byte(SPI_SEC_BCM5387, 0x10);
spi_write_byte(SPI_SEC_BCM5387, local_reg_addr);
if(OK != bcm5387_poll_rack(1))
{
printf("\nbcm5387_read:cannot get RACK\n");
return ERROR;
}
bcm5387_read_bytes(8,local_buffer);
spi_slave_sel(SPI_SEC_BCM5387, 0);
}
if(i == (byte_cnt/8))
{
local_reg_addr=reg_addr+i*8;
local_buffer = pbuffer;
spi_slave_sel(SPI_SEC_BCM5387, 1);
/*fast mode*/
spi_write_byte(SPI_SEC_BCM5387, 0x10);
spi_write_byte(SPI_SEC_BCM5387, local_reg_addr);
if(OK != bcm5387_poll_rack(1))
{
printf("\nbcm5387_read:cannot get RACK\n");
return ERROR;
}
bcm5387_read_bytes((byte_cnt-i*8),local_buffer);
spi_slave_sel(SPI_SEC_BCM5387, 0);
}
}
}
return OK;
}
/*------------------------------------------------------------------------------
*
* Function Name: bcm5387_write
*
* Input(s):
* UINT8 addr:
* UINT8 byte_cnt:
* UINT8 *pdata:
*
* Output(s):
* <none>
*
* Returns:
* NB_DRV_OK:
* NB_DRV_ERROR:
*
* Description:
* <CMD, CHIP ID, W><REG ADDR><DATA0>...<DATAn>
* CHIP ID = 000,R = 0, W = 1
* Normal SPI:0110|CHIP ID2|CHIP ID1|CHIP ID0|R/W|
------------------------------------------------------------------------------*/
#if 0
SYS_STATUS bcm5387_write( UINT8 page, UINT8 reg_addr, UINT8 byte_cnt, UINT8 *pbuffer)
{
UINT32 i = 0;
UINT8 u8temp=0;
UINT32 time_out;
if((MAX_BYTE_CNT < byte_cnt) ||(NULL == pbuffer))
{
return NB_DRV_ERROR;
}
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;
}
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);
/*second: write data*/
for(i=0;i<=(byte_cnt-1);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)0x01)
{
break;
}
}
if(!time_out)
{
printf("\nCannot get TXRDY\n ");
return ERROR;
}
}
spi_slave_sel(SPI_SEC_BCM5387, 1);
spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_WRITE_PACKET);
spi_write_byte(SPI_SEC_BCM5387, reg_addr);
#if 0
u8temp=(UINT8)(*pbuffer &0xff);
spi_write_byte(SPI_SEC_BCM5387, u8temp);
u8temp=(UINT8)((*pbuffer>>8) & 0xff);
spi_write_byte(SPI_SEC_BCM5387, u8temp);
#endif
spi_write_byte(SPI_SEC_BCM5387,pbuffer);
pbuffer++;
spi_slave_sel(SPI_SEC_BCM5387, 0);
}
return NB_DRV_OK;
}
#endif
#if 1
SYS_STATUS bcm5387_write( UINT8 page, UINT8 reg_addr, UINT8 byte_cnt, UINT8 *pbuffer)
{
UINT8 *local_buffer=pbuffer;
UINT8 local_reg_addr=reg_addr;
UINT32 i;
UINT32 time_out;
for(time_out=3;time_out>0;time_out--)
{
if(OK != bcm5387_poll_spif())
{
bcm5387_write_new_page(page);
}
else
{
break;
}
}
if(!time_out)
{
printf("\nCannot get SPIF!!!\n");
return ERROR;
}
bcm5387_write_new_page(page);
if(byte_cnt <=8)
{
spi_slave_sel(SPI_SEC_BCM5387, 1);
spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_WRITE_PACKET);
spi_write_byte(SPI_SEC_BCM5387, reg_addr);
bcm5387_write_bytes(byte_cnt, pbuffer);
spi_slave_sel(SPI_SEC_BCM5387, 0);
}
else
{
for(i=0;i<=byte_cnt/8;i++)
{
if(0 != i)
{
if(OK != bcm5387_poll_txrdy())
{
printf("bcm5387_read:cannot get TXRDY");
/*return ERROR;*/
}
}
if(i != (byte_cnt/8))
{
local_reg_addr=reg_addr+i*8;
local_buffer = pbuffer+byte_cnt-(i+1)*8;
spi_slave_sel(SPI_SEC_BCM5387, 1);
spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_WRITE_PACKET);
spi_write_byte(SPI_SEC_BCM5387, local_reg_addr);
bcm5387_write_bytes(8, local_buffer);
spi_slave_sel(SPI_SEC_BCM5387, 0);
}
if(i == (byte_cnt/8))
{
local_reg_addr=reg_addr+i*8;
local_buffer = pbuffer;
spi_slave_sel(SPI_SEC_BCM5387, 1);
spi_write_byte(SPI_SEC_BCM5387, BCM5387_CTRL_WRITE_PACKET);
spi_write_byte(SPI_SEC_BCM5387, local_reg_addr);
bcm5387_write_bytes((byte_cnt-i*8), local_buffer);
spi_slave_sel(SPI_SEC_BCM5387, 0);
}
}
}
return NB_DRV_OK;
}
#endif
LOCAL SYS_STATUS bcm5387_poll_spif()
{
UINT32 time_out;
UINT8 u8temp;
for(time_out=1000; 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");
bcm5387_write_new_page(0);
return ERROR;
}
return NB_DRV_OK;
}
/*------------------------------------------------------------------------------
*
* Function Name: bcm5387_poll_rack
*
* Input(s):
* UINT8 mode:1-fast mode 0-normal mode
*
* Output(s):
* <none>
*
* Returns:
* NB_DRV_OK:
* NB_DRV_ERROR:
*
* Description:
* get RACK
------------------------------------------------------------------------------*/
LOCAL SYS_STATUS bcm5387_poll_rack(UINT8 mode)
{
UINT32 time_out;
UINT8 u8temp;
if(0==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)0x20)
{
break;
}
/*spi_delay(200);*/
};
if(!time_out)
{
printf("\nTime out for get RACK\n");
spi_slave_sel(SPI_SEC_BCM5387, 0);
return ERROR;
}
}
else
{
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;
}
}
return NB_DRV_OK;
}
LOCAL SYS_STATUS bcm5387_poll_rxrdy()
{
UINT32 time_out;
UINT8 u8temp;
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;
}
return NB_DRV_OK;
}
LOCAL SYS_STATUS bcm5387_poll_txrdy()
{
UINT32 time_out;
UINT8 u8temp;
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)0x01)
{
break;
}
}
if(!time_out)
{
printf("\nCannot get TXRDY!!\n");
return ERROR;
}
return NB_DRV_OK;
}
LOCAL SYS_STATUS bcm5387_read_bytes(UINT8 bytes, UINT8 * buffer_ptr)
{
UINT32 i;
if((MAX_BYTE_CNT < bytes) ||(NULL == buffer_ptr))
{
return NB_DRV_ERROR;
}
buffer_ptr+=(bytes-1);/*bcm5387 is little endian, so we should reverse*/
for(i=0;i<bytes;i++)
{
spi_read_byte(SPI_SEC_BCM5387,buffer_ptr);
buffer_ptr--;/*bcm5387 is little endian, so we should reverse*/
/*buffer_ptr++;*/
}
return NB_DRV_OK;
}
LOCAL SYS_STATUS bcm5387_write_bytes(UINT8 bytes, UINT8 * buffer_ptr)
{
UINT32 i;
if((MAX_BYTE_CNT < bytes) ||(NULL == buffer_ptr))
{
return NB_DRV_ERROR;
}
buffer_ptr+=(bytes-1);/*bcm5387 is little endian, so we should reverse*/
for(i=0;i<bytes;i++)
{
spi_write_byte(SPI_SEC_BCM5387,(UINT8)(*buffer_ptr));
buffer_ptr--;/*bcm5387 is little endian, so we should reverse*/
/*buffer_ptr++;*/
}
return NB_DRV_OK;
}
LOCAL void bcm5387_write_new_page(UINT8 page)
{
spi_slave_sel(SPI_SEC_BCM5387, 1);
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);
}
/*zjl 添加 的测试代码 开始*/
LOCAL void zjl_test(void)
{ UINT8 page,reg_addr=0;
UINT8 byte_cnt=0;
UINT8 data[8];
spi_init();
while(1)
{
bcm5387_read(page,reg_addr,byte_cnt,&data);
bcm5387_write(page,reg_addr,byte_cnt,&data );
}
}
/*zjl 添加 的测试代码 结束*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -