中级会员
- 积分
- 476
- 威望
- 299
- 贡献
- 85
- 兑换币
- 13
- 注册时间
- 2012-2-20
- 在线时间
- 46 小时
- 毕业学校
- CQJTU
|
20贡献
//=========================================================================
void hw_spi_init(uint8 spiNo,uint8 master,uint8 speed)
{
SPI_MemMapPtr BaseAdd = hw_spi_get_base_address(spiNo);
//使能SPI模块时钟,配置SPI引脚功能
if(spiNo == 0)
{
SIM_SCGC6 |= SIM_SCGC6_DSPI0_MASK;
PORTA_PCR14 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//PCS0
PORTA_PCR15 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//SCK
PORTA_PCR16 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//SOUT
PORTA_PCR17 = 0 | PORT_PCR_MUX(0x2);//SIN
}
else if(spiNo == 1)
{
SIM_SCGC6 |= SIM_SCGC6_SPI1_MASK;
PORTE_PCR1 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//SOUT
PORTE_PCR2 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//SCK
PORTE_PCR3 = 0 | PORT_PCR_MUX(0x2);//SIN
PORTE_PCR4 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//PCS0
}
else
{
SIM_SCGC3 |= SIM_SCGC3_SPI2_MASK;
}
SPI_MCR_REG(BaseAdd) = 0
| SPI_MCR_CLR_TXF_MASK //Clear the Tx FIFO counter.
| SPI_MCR_CLR_RXF_MASK //Clear the Rx FIFO counter.
| SPI_MCR_PCSIS_MASK
| SPI_MCR_HALT_MASK;
//根据主从机模式设置工作模式
if(master == MASTER)
{
if(speed == SPI_SPEED_LOW)
{
SPI_MCR_REG(BaseAdd) |= SPI_MCR_MSTR_MASK;
SPI_CTAR_REG(BaseAdd,0) = 0
| SPI_CTAR_DBR_MASK
| SPI_CTAR_FMSZ(0x07)
| SPI_CTAR_PDT_MASK//延时因子为7
| SPI_CTAR_BR(8)
| SPI_CTAR_CPOL_MASK
| SPI_CTAR_CPHA_MASK;
}
else
{
SPI_MCR_REG(BaseAdd) |= SPI_MCR_MSTR_MASK;
SPI_CTAR_REG(BaseAdd,0) = 0
| SPI_CTAR_DBR_MASK
| SPI_CTAR_FMSZ(0x07)
| SPI_CTAR_PDT_MASK//延时因子为7
| SPI_CTAR_BR(0)
| SPI_CTAR_CPOL_MASK
| SPI_CTAR_CPHA_MASK;
}
}
else
{
SPI_CTAR_SLAVE_REG(BaseAdd,0) = 0
| SPI_CTAR_SLAVE_FMSZ(0x07)
| SPI_CTAR_SLAVE_CPOL_MASK
| SPI_CTAR_SLAVE_CPHA_MASK;
}
SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK
| SPI_SR_TFUF_MASK
| SPI_SR_TFFF_MASK
| SPI_SR_RFOF_MASK
| SPI_SR_RFDF_MASK);
SPI_MCR_REG(BaseAdd) &= ~SPI_MCR_HALT_MASK;
}
uint8 DrvSPI_SendOneByte_ActiveCS(uint8 spiNo, uint8 buffer)
{
uint8 RX_Data;
SPI_MemMapPtr BaseAdd = hw_spi_get_base_address(spiNo);
SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK //在发送数据之前先清除接收最后一帧标志位
| SPI_SR_TFUF_MASK //在发送数据之前先清除TX FIFO下溢标志
| SPI_SR_TFFF_MASK //在发送数据之前先清除TX FIFO充满标志
| SPI_SR_RFOF_MASK //在发送数据之前先清除RX FIFO溢出标志
| SPI_SR_RFDF_MASK); //在发送数据之前先清除RX FIFO不空标志
SPI_MCR_REG(BaseAdd) |= SPI_MCR_CLR_TXF_MASK
| SPI_MCR_CLR_RXF_MASK; //在发送数据之前先清除TX FIFO和RX FIFO
SPI_SR_REG(BaseAdd) |= SPI_SR_TCF_MASK; //清除发送完成标志
SPI_PUSHR_REG(BaseAdd) = (SPI_PUSHR_CTAS(0) //选择CTAR0寄存器定义传输特性
| SPI_PUSHR_EOQ_MASK //该帧SPI数据是最后一帧数据
| SPI_PUSHR_PCS(1) //片选信号PCS0
| SPI_PUSHR_TXDATA(buffer)); //写入数据
SPI_MCR_REG(BaseAdd) &= ~SPI_MCR_HALT_MASK; //启动SPI数据传输
while((SPI_SR_REG(BaseAdd) & SPI_SR_TCF_MASK) == 0); //等待发送完成
SPI_SR_REG(BaseAdd) |= SPI_SR_TCF_MASK; //清除传送完成标志
while((SPI_SR_REG(BaseAdd) & SPI_SR_RFDF_MASK) == 0); //等待接收缓冲区有有效数据,即等待RX FIFO不为空为止
RX_Data = (uint8)SPI_POPR_REG(BaseAdd); //读取RX FIFO内部数据
SPI_SR_REG(BaseAdd) |= SPI_SR_RFDF_MASK; //清除RX FIFO不为空标志
SPI_MCR_REG(BaseAdd) |= SPI_MCR_HALT_MASK; //停止SPI数据传输
return (RX_Data);
}
/************发送bu读回***********/
uint8 DrvSPI_SendOneByte_InactiveCS(uint8 spiNo, uint8 buffer)
{
uint8 RX_Data;
SPI_MemMapPtr BaseAdd = hw_spi_get_base_address(spiNo);
SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK //在发送数据之前先清除接收最后一帧标志位
| SPI_SR_TFUF_MASK //在发送数据之前先清除TX FIFO下溢标志
| SPI_SR_TFFF_MASK //在发送数据之前先清除TX FIFO充满标志
| SPI_SR_RFOF_MASK //在发送数据之前先清除RX FIFO溢出标志
| SPI_SR_RFDF_MASK); //在发送数据之前先清除RX FIFO不空标志
SPI_MCR_REG(BaseAdd) |= SPI_MCR_CLR_TXF_MASK
| SPI_MCR_CLR_RXF_MASK; //在发送数据之前先清除TX FIFO和RX FIFO
SPI_SR_REG(BaseAdd) |= SPI_SR_TCF_MASK; //清除发送完成标志
SPI_PUSHR_REG(BaseAdd) = (SPI_PUSHR_CTAS(0) //选择CTAR0寄存器定义传输特性
| SPI_PUSHR_EOQ_MASK //该帧SPI数据是最后一帧数据
| SPI_PUSHR_PCS(0) //片选信号PCS0
| SPI_PUSHR_TXDATA(buffer)); //写入数据
SPI_MCR_REG(BaseAdd) &= ~SPI_MCR_HALT_MASK; //启动SPI数据传输
while((SPI_SR_REG(BaseAdd) & SPI_SR_TCF_MASK) == 0); //等待发送完成
SPI_SR_REG(BaseAdd) |= SPI_SR_TCF_MASK; //清除传送完成标志
while((SPI_SR_REG(BaseAdd) & SPI_SR_RFDF_MASK) == 0); //等待接收缓冲区有有效数据,即等待RX FIFO不为空为止
RX_Data = (uint8)SPI_POPR_REG(BaseAdd); //读取RX FIFO内部数据
SPI_SR_REG(BaseAdd) |= SPI_SR_RFDF_MASK; //清除RX FIFO不为空标志
SPI_MCR_REG(BaseAdd) |= SPI_MCR_HALT_MASK; //停止SPI数据传输
return (RX_Data);
}
unsigned char SD_Init(void)
{
int i ;
// 用来循环计数
unsigned char r1 =0;
// 存放SD卡的返回值
unsigned int retry ;
// 用来进行超时计数
unsigned char buff[6];
// 纯延时,等待SD卡上电完成
for(i=0;i<0xf00;i++);
//先产生>74个脉冲,让SD卡自己初始化完成
for(i=0;i<10;i++)
{
DrvSPI_SendOneByte_InactiveCS(SPI_1, 0XFF);
}
//-----------------SD卡复位到idle开始-----------------
//循环连续发送CMD0,直到SD卡返回0x01,进入IDLE状态
//超时则直接退出
retry=0 ;
while((r1!=0x01)&&(retry<200))
{ //发送CMD0,让SD卡进入IDLE状态
r1=SD_SendCommand(CMD0,0,0x95);
retry++;
}
//跳出循环后,检查原因:初始化成功?or 重试超时?
if(retry==200)
{
// put_s("SD Time out!");
return 1 ;
//超时返回1
}
总是超时退出,不能进idle SPI测试能自发自收数据,请高手帮忙解惑!!!!!
|
|