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

📄 spidrv8548.c

📁 MPC8548上用GPIO口模拟的SPI控制器.包括初始化,单字节读写,多字节读写等等.调试通过
💻 C
📖 第 1 页 / 共 3 页
字号:
	
#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 + -