//模拟的SPI读
UINT8 Spi_Read_Dat(UINT8 addr)
{
UINT8 i;
Ic_Cs_Set(0);
addr = ((addr<<1)&0x7E)|0x80;
for(i=8;i>0;i--)
{
if(addr&0x80)Spi_Mosi_Set(1);
else Spi_Mosi_Set(0);
Spi_Clk_Set(1);
addr <<= 1;
Spi_Clk_Set(0);
}
for(i=8;i>0;i--)
{
Spi_Clk_Set(1);
addr <<= 1;
if(IO_Spi_Miso)addr|=0x01;
Spi_Clk_Set(0);
}
Ic_Cs_Set(1);
return addr;
}
//模拟的SPI写
void Spi_Write_Dat(UINT8 addr, UINT8 dat)
{
UINT8 i;
Ic_Cs_Set(0);
addr = ((addr<<1)&0x7E);
for(i=8;i>0;i--)
{
if(addr&0x80)Spi_Mosi_Set(1);
else Spi_Mosi_Set(0);
Spi_Clk_Set(1);
addr <<= 1;
Spi_Clk_Set(0);
}
for(i=8;i>0;i--)
{
Spi_Mosi_Set(dat&0x80);
Spi_Clk_Set(1);
dat <<= 1;
Spi_Clk_Set(0);
}
Ic_Cs_Set(1);
}
//模拟的全部可以正常工作没问题
//系统自带的硬件SPI
UINT8 Spi_Read_Dat(UINT8 addr)
{
addr = ((addr<<1)&0x7E)|0x80;
Ic_Cs_Set(0);
SPI0_MasterSendByte(addr);
addr=SPI0_MasterRecvByte();
}
//硬件SPI 写
void Spi_Write_Dat(UINT8 addr, UINT8 dat)
{
addr = ((addr<<1)&0x7E);
Ic_Cs_Set(0);
SPI0_MasterSendByte(addr);
SPI0_MasterSendByte(dat);
}
GPIOPinRemap(ENABLE, RB_PIN_SPI0); //重新映射SPI
GPIOB_ModeCfg(SPI_CLK_PIN|SPI_MOSI_PIN|IC_CS_PIN|IC_RESET_PIN,GPIO_ModeOut_PP_5mA);
SPI0_MasterDefInit();
void SPI0_MasterDefInit( void )
{
R8_SPI0_CLOCK_DIV = 8;// 主频时钟4分频,最小分频2,读卡只能是3,2太快4太慢,LCD可以是2
R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI0_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE ;
R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF; // 访问BUFFER/FIFO自动清除IF_BYTE_END标志
R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE; // 不启动DMA方式
}