智能车制作
标题:
用MCF52259写了好久的QSPI的程序,但是还没有成功驱动NRF24L01啊啊啊啊
[打印本页]
作者:
守候一米阳光
时间:
2014-2-26 23:44
标题:
用MCF52259写了好久的QSPI的程序,但是还没有成功驱动NRF24L01啊啊啊啊
用MCF52259写了好久的QSPI的程序,但是还没有成功驱动NRF24L01啊啊啊啊,,有哪位大神可愿意把代码分享下,真是感激不尽啊,
作者:
守候一米阳光
时间:
2014-2-27 01:19
本帖最后由 守候一米阳光 于 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口初始化的函数执行过了)
作者:
守候一米阳光
时间:
2014-2-27 15:09
怎么没人帮我
作者:
守候一米阳光
时间:
2014-2-27 17:01
还是没人帮
作者:
守候一米阳光
时间:
2014-2-28 09:55
怎么还是没人回应呢
:Q
作者:
守候一米阳光
时间:
2014-2-28 17:09
还是没人回应
作者:
守候一米阳光
时间:
2014-3-3 22:09
:(
作者:
Mr、C
时间:
2014-4-6 17:36
你的QSPI能正确发送和接收数据吗?
作者:
守候一米阳光
时间:
2014-4-8 22:36
Mr、C 发表于 2014-4-6 17:36
你的QSPI能正确发送和接收数据吗?
现在可以了,用的NRF24L01无线模块
作者:
Mr、C
时间:
2014-4-9 10:54
守候一米阳光 发表于 2014-4-8 22:36
现在可以了,用的NRF24L01无线模块
可以加个QQ讨论一下么?我说的QSPI写了两个多星期都没写出来
作者:
wait小乖
时间:
2015-5-8 14:19
还在吗?
作者:
外星来来
时间:
2015-8-7 11:09
麻烦楼主上线能不能回复我一下
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2