中级会员
- 积分
- 489
- 威望
- 266
- 贡献
- 127
- 兑换币
- 130
- 注册时间
- 2013-11-18
- 在线时间
- 48 小时
- 毕业学校
- 长春理工大学
|
2#
楼主 |
发表于 2014-2-27 01:19:50
|
只看该作者
本帖最后由 守候一米阳光 于 2014-2-27 01:27 编辑
补充下:
请大神仔细看看下面的程序啊:
void qspi_init(void)
{
MCF_GPIO_PQSPAR=0|MCF_GPIO_PQSPAR_QSPI_DOUT_DOUT
|MCF_GPIO_PQSPAR_QSPI_CLK_CLK
|MCF_GPIO_PQSPAR_QSPI_CS2_CS2
|MCF_GPIO_PQSPAR_QSPI_DIN_DIN;
MCF_QSPI_QMR=0
|MCF_QSPI_QMR_MSTR //1 QSPI是主模式。为了QSPI模块的正确运行必须置一。
|MCF_QSPI_QMR_BITS(8) //8位需要被转变
|MCF_QSPI_QMR_BAUD(4);// 公式MR[BAUD]=fsys/(2*期望得到的QSPI_CLK波特率)
MCF_QSPI_QMR &= ~MCF_QSPI_QMR_CPOL;//时钟极性设置: 停止状态QSPI_CLK的值是逻辑等级0
MCF_QSPI_QMR &= ~MCF_QSPI_QMR_CPHA;//数据在QSPI_CLK的下降沿改变,在上升沿捕获 //set delay
MCF_QSPI_QDLYR=0
|MCF_QSPI_QDLYR_QCD(1) //QSPI_CLK延时。
|MCF_QSPI_QDLYR_DTL(1); //转换后延时。
MCF_QSPI_QWR=MCF_QSPI_QWR_CSIV //在转移中,当值不在当前的命令中,QSPI芯片选择输出来返回1(指的是,停止状态为0,芯片选择高电平)
|MCF_QSPI_QWR_ENDQP(0)
|MCF_QSPI_QWR_NEWQP(0);
//|MCF_QSPI_QWR_WREN;
//clear flag
MCF_QSPI_QIR=MCF_QSPI_QIR_WCEFB //写入冲突访问错误使能
|MCF_QSPI_QIR_ABRTB //中止访问错误。
|MCF_QSPI_QIR_ABRTL //中止访问错误。
|MCF_QSPI_QIR_WCEF //清除写冲突错误标记
|MCF_QSPI_QIR_ABRT //清除中止标记
|MCF_QSPI_QIR_SPIF; //清除QSPI完成标记
// MCF_QSPI_QWR = MCF_QSPI_QWR_CSIV;
}
/*
*功能:用QSPI发送一个字节
*
*参数:CSn:所选择的通道
* data:要发送的数据
*/
void qspi_sendbyte(uint8 CSn,uint8 data)
{
MCF_QSPI_QAR=MCF_QSPI_QAR_TRANS;
MCF_QSPI_QDR=data;
MCF_QSPI_QAR=MCF_QSPI_QAR_CMD;
MCF_QSPI_QDR=(uint16)(MCF_QSPI_QDR_BITSE
&(~(1<<(8+CSn))
|MCF_QSPI_QDR_DT
|MCF_QSPI_QDR_DSCK));
MCF_QSPI_QDLYR|=MCF_QSPI_QDLYR_SPE;
while(!(MCF_QSPI_QIR&MCF_QSPI_QIR_SPIF))
{
;
}
MCF_QSPI_QIR|=MCF_QSPI_QIR_SPIF;
}
/*
*
*功能:QSPI接收一个字节数据
*
*参数:CSn:选择的通道
*/
uint16 qspi_receivebyte(uint8 CSn)
{
uint16 temp=0;
MCF_QSPI_QAR=MCF_QSPI_QAR_ADDR(COMMAND_ADDR);
MCF_QSPI_QDR=(uint16)(MCF_QSPI_QDR_BITSE
&(~(1<<(8+CSn)))
|MCF_QSPI_QDR_DT
|MCF_QSPI_QDR_DSCK);
MCF_QSPI_QAR=MCF_QSPI_QAR_TRANS;
MCF_QSPI_QDR=temp;
MCF_QSPI_QDLYR|=MCF_QSPI_QDLYR_SPE;
while(!(MCF_QSPI_QIR&MCF_QSPI_QIR_SPIF)) ;
MCF_QSPI_QIR|=MCF_QSPI_QIR_SPIF;
MCF_QSPI_QAR=MCF_QSPI_QAR_ADDR(RECEIVE_ADDR);
temp=MCF_QSPI_QDR;
return temp;
}
上面是MCF52259的QSPI的初始化
然后我想先在主程序里执行一个 NRF_Check();函数,检查芯片和24L01是否正常连接:
uint8 NRF_Check(void)
{
uint8 buf[5]={0xC2,0xC2,0xC2,0xC2,0xC2};
uint8 buf1[5];
uint8 i;
/*写入5个字节的地址. */
SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,buf,5);
/*读出写入的地址 */
SPI_NRF_ReadBuf(TX_ADDR,buf1,5);
/*比较*/
for(i=0;i<5;i++)
{
if(buf1!=0xC2)
break;
}
if(i==5)
return 1; //MCU与NRF成功连接
else
return 0 ; //MCU与NRF不正常连接
}
uint8 SPI_NRF_WriteBuf(uint8 reg ,uint8 *pBuf,uint8 bytes)
{
uint8 status,byte_cnt;
NRF_CE_LOW();
delayms(0xff);
/*置低CSN,使能SPI传输*/
NRF_CSN_LOW();
delayms(0xff);
/*发送寄存器号*/
status = SPI_NRF_RW(reg);
/*向缓冲区写入数据*/
for(byte_cnt=0;byte_cnt<bytes;byte_cnt++)
SPI_NRF_RW(*pBuf++); //写数据到缓冲区
/*CSN拉高,完成*/
NRF_CSN_HIGH();
return (status); //返回NRF24L01的状态
}
uint8 SPI_NRF_ReadBuf(uint8 reg,uint8 *pBuf,uint8 bytes)
{
uint8 status, byte_cnt;
NRF_CE_LOW();
delayms(0xff);
/*置低CSN,使能SPI传输*/
NRF_CSN_LOW();
delayms(0xff);
/*发送寄存器号*/
status = SPI_NRF_RW(reg);
/*读取缓冲区数据*/
for(byte_cnt=0;byte_cnt<bytes;byte_cnt++)
pBuf[byte_cnt] = SPI_NRF_RW(NOP); //从NRF24L01读取数据
/*CSN拉高,完成*/
NRF_CSN_HIGH();
return status; //返回寄存器状态值
}
/*
* 函数名:SPI_NRF_RW
* 描述 :用于向NRF读/写一字节数据
* 输入 :写入的数据
* 输出 :读取得的数据
* 调用 :内部调用
*/
uint8 SPI_NRF_RW(uint8 dat)
{
/* 通过 QSPI发送一字节数据 */
qspi_sendbyte(1,dat);
/* 通过 QSPI接收一字节数据 */
return qspi_receivebyte(1);
}
然后我在主函数里用串口把NRF_Check();函数的返回值发到电脑上,但总是返回0;(PS:我在主函数的开头已将QSPI初始化的函数,和相应IO口初始化的函数执行过了)
|
|