📄 qspi.c
字号:
#include "qspi.h"
//-------------------------------------------------------------------------*
//函数名: QSPI_init *
//功 能: 初始化MCF5223x的QSPI模块 *
//返 回: 无 *
//说 明: QSPI不能工作在从机模式下 *
//-------------------------------------------------------------------------*
void QSPI_init(QSPI_InitPara QSPIpara)
{
//1.主机模式,传输位数,以及波特率配置
MCF_QSPI_QMR = (0
|MCF_QSPI_QMR_MSTR
|MCF_QSPI_QMR_BITS(QSPIpara.bitcnt)
|MCF_QSPI_QMR_BAUD(QSPIpara.fsys * 1000 /(2 * QSPIpara.Baud))
);
//2.时钟相位和极性配置
if(QSPIpara.CPHA==1)
MCF_QSPI_QMR |=MCF_QSPI_QMR_CPHA ;
if(QSPIpara.CPOL==1)
MCF_QSPI_QMR |=MCF_QSPI_QMR_CPOL ;
MCF_QSPI_QDLYR = (0
|MCF_QSPI_QDLYR_DTL(QSPIpara.QCD)
|MCF_QSPI_QDLYR_QCD(QSPIpara.DTL)
);
//3.片选信号空闲电平配置
if(QSPIpara.csiv==1)
MCF_QSPI_QWR =0 | MCF_QSPI_QWR_CSIV | MCF_QSPI_QWR_NEWQP(QSPIpara.NEWQP);
else
MCF_QSPI_QWR =0 | MCF_QSPI_QWR_NEWQP(QSPIpara.NEWQP);
//4.环绕模式配置
if(QSPIpara.WREN==1)
{
if(QSPIpara.WRTO==1)
MCF_QSPI_QWR = MCF_QSPI_QWR_WRTO
|MCF_QSPI_QWR_WREN;
else
MCF_QSPI_QWR = MCF_QSPI_QWR_WRTO;
}
//5.中断配置
if(QSPIpara.SPIFE==1)
MCF_QSPI_QIR =0|MCF_QSPI_QIR_SPIFE;
//6.QSPI模块引脚配置:
//QSPI共使用7个引脚:QSPI_DOUT,QSPI_DIN,QSPI_CLK,CS0,CS1,CS2,CS3
//引脚分配:PQSPAR0-QSPI_DOUT PQSPAR1-QSPI_DIN PQSPAR2-QSPI_CLK
// PQSPAR3-QSPI_CS0 PQSPAR4-QSPI_CS1 PQSPAR5-QSPI_CS2
// PQSPAR6-QSPI_CS3
//PQSPAR:端口QS引脚分配寄存器 0x01:主功能
MCF_GPIO_PQSPAR =(0
|MCF_GPIO_PQSPAR_PQSPAR0(0x1)
|MCF_GPIO_PQSPAR_PQSPAR1(0x1)
|MCF_GPIO_PQSPAR_PQSPAR2(0x1)
|MCF_GPIO_PQSPAR_PQSPAR3(0x1)
|MCF_GPIO_PQSPAR_PQSPAR4(0x1)
|MCF_GPIO_PQSPAR_PQSPAR5(0x1)
|MCF_GPIO_PQSPAR_PQSPAR6(0x1));
}
//-------------------------------------------------------------------------*
//函数名: QSPI_WriteToRAM1 *
//功 能: 写一个数据到发送RAM *
//参 数: address:发送RAM起始地址 *
// data:要写入发送RAM的数据 *
//返 回: 无 *
//说 明: *
//QSPI模块RAM(包括发送接收RAM和命令RAM)可以通过QAR 和 QDR间接访问。QAR决定 *
//写RAM的起始地址。QDR为数据存放寄存器,写入到QDR寄存器中的数据将按照QAR指 *
//定的地址依次放后位置。 *
//-------------------------------------------------------------------------*
void QSPI_WriteToRAM1( uint8 address, uint16 data )
{
MCF_QSPI_QAR = address;
MCF_QSPI_QDR = data;
}
//-------------------------------------------------------------------------*
//函数名: QSPI_WriteToRAMN *
//功 能: 写N个数据到发送RAM *
//参 数: address:发送RAM起始地址 *
// data:要写入发送RAM的数组 bytes:写入数据长度 *
//返 回: 无 *
//-------------------------------------------------------------------------*
void QSPI_WriteToRAMN(uint8 address, uint16 data[],uint8 N)
{
uint8 i=0;
for(;i<N;i++)
{
QSPI_WriteToRAM1(address + i,data[i]);
}//发送数据
}
//-------------------------------------------------------------------------*
//函数名: QSPI_ReadFromRAM1 *
//功 能: 接收一个数据 *
//参 数: address:接收RAM起始地址 *
//返 回: 接收到的数据 *
//说 明: *
//QSPI模块RAM(包括发送接收RAM和命令RAM)可以通过QAR 和 QDR间接访问。QAR决定 *
//读RAM的起始地址。读QDR寄存器中可以得到相应RAM区的数据 *
//-------------------------------------------------------------------------*
uint16 QSPI_ReadFromRAM1(uint8 address )
{
MCF_QSPI_QAR = address;
return( MCF_QSPI_QDR );
}
//-------------------------------------------------------------------------*
//函数名: QSPI_ReadFromRAMN *
//功 能: 接收N个数据 *
//参 数: address:接收RAM起始地址 *
// data[]:接收数据存放位置 *
// N:数据个数 *
//返 回: 接收到的数据 *
//说 明: *
//QSPI模块RAM(包括发送接收RAM和命令RAM)可以通过QAR 和 QDR间接访问。QAR决定 *
//读RAM的起始地址。读QDR寄存器中可以得到相应RAM区的数据 *
//-------------------------------------------------------------------------*
uint16 QSPI_ReadFromRAMN(uint8 address,uint16 data[],uint8 N)
{
uint8 i=0;
for(;i<N;i++)
{
data[i]=QSPI_ReadFromRAM1(address);
}
}
//-------------------------------------------------------------------------*
//函数名: QSPI_StartTrans *
//功 能: 该函数启动QSPI传输,并轮询SPIF标志以判断传输是否结束 *
//参 数: N:QSPI传输数据长度 *
//返 回: 发送是否成功标志 0:失败 1:成功 *
//-------------------------------------------------------------------------*
uint8 QSPI_StartTrans(uint8 N)
{
uint16 i=0;
MCF_QSPI_QIR |= MCF_QSPI_QIR_SPIF; //清发送完成中断
MCF_QSPI_QWR |=MCF_QSPI_QWR_ENDQP(N-1);
MCF_QSPI_QDLYR |= MCF_QSPI_QDLYR_SPE; //启动SPI传输
for(;i<0xFFFE;i++) //限时等待
{
if(MCF_QSPI_QIR & MCF_QSPI_QIR_SPIF) //轮询QSPI传输结束使能位SPIF
//同步接收数据 接收数据代码
return (1);
}
return (0) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -