智能车制作

标题: 用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