智能车制作

标题: 哪位大仙用过K60 SPI 与NRF24L01实现无线通信啊 [打印本页]

作者: loucyin    时间: 2012-11-6 20:17
标题: 哪位大仙用过K60 SPI 与NRF24L01实现无线通信啊
    网上有GPIO口模拟SPI控制NRF24L01的,但是我用K60内部SPI通信时,读写不了NRF24L01的寄存器啊!求大神解释。


void spi2_init (void)
{
    //使能SPI2时钟
    SIM_SCGC3 |= SIM_SCGC3_SPI2_MASK;
    //spi2PCS0,SCK,SIN,SOUT端口初始化
    PORTB_PCR20 |= PORT_PCR_MUX(2) ;
    PORTB_PCR21 |= PORT_PCR_MUX(2) ;
    PORTB_PCR22 |= PORT_PCR_MUX(2) ;
    PORTB_PCR23 |= PORT_PCR_MUX(2) ;
    //SPI2主机模式,传输停止状态
    SPI2_MCR = (SPI_MCR_MSTR_MASK | SPI_MCR_HALT_MASK);
    //清除接受队列,发送队列,片选信号低电平有效
    SPI2_MCR |= SPI_MCR_CLR_RXF_MASK ;
    SPI2_MCR |= SPI_MCR_CLR_TXF_MASK ;
    SPI2_MCR |= SPI_MCR_ROOE_MASK ;
    SPI2_MCR |= SPI_MCR_PCSIS_MASK ;
    //每帧8比特,波特率为5M,双重波特率
    SPI2_CTAR0 = SPI_CTAR_FMSZ(7) ;
    SPI2_CTAR0 |= SPI_CTAR_PBR(2) ;
    SPI2_CTAR0 |= SPI_CTAR_BR(3) ;
    SPI2_CTAR0 |= SPI_CTAR_DBR_MASK ;

    //清除队列尾标志,传输队列下溢标志,传输队列满标志,接收队列溢出、损耗标志
    SPI2_SR = (SPI_SR_EOQF_MASK
               | SPI_SR_TFUF_MASK
                   | SPI_SR_TFFF_MASK
                       | SPI_SR_RFOF_MASK
                           | SPI_SR_RFDF_MASK);
    SPI2_MCR &= ~SPI_MCR_MDIS_MASK;//使能DSPI时钟
    SPI2_MCR &= ~SPI_MCR_HALT_MASK;//启动SPI模块
}

uint8 SPI_RW(uint8 value)
{
    uint8 rvalue;
    SPI2_SR = SPI2_SR;
    SPI1_PUSHR = SPI_PUSHR_TXDATA(value);
    SPI2_PUSHR = (SPI_PUSHR_PCS(1)
                  | SPI_PUSHR_TXDATA(*va));
    while(!(SPI2_SR&SPI_SR_RFDF_MASK));
    rvalue=SPI2_POPR;
}


作者: 野火    时间: 2012-11-6 21:43
本帖最后由 野火 于 2012-11-6 21:49 编辑

我们已经开源了 用内部SPI模块来驱动的了……首家独家 开源的 K60 内部 SPI模块控制NRF24L01+……网上搜索“野火k60开发板开源代码 ”即可找到

而且实现了中断发送和中断接收……发送 80*60大小的二值化图像,可达30帧每秒(NRF24L01+的极限了),而且中断方式发送,可在发送过程中MCU处理其他数据……



作者: loucyin    时间: 2012-11-7 18:54
野火 发表于 2012-11-6 21:43
我们已经开源了 用内部SPI模块来驱动的了……首家独家 开源的 K60 内部 SPI模块控制NRF24L01+……网上搜 ...

太感谢了

作者: whenov    时间: 2012-11-7 20:00
野火 发表于 2012-11-6 21:43
我们已经开源了 用内部SPI模块来驱动的了……首家独家 开源的 K60 内部 SPI模块控制NRF24L01+……网上搜 ...

请问你们试过nrf24l01的半双工通信吗?

作者: 野火    时间: 2012-11-8 08:53
whenov 发表于 2012-11-7 20:00
请问你们试过nrf24l01的半双工通信吗?

试过的啊……

作者: loucyin    时间: 2012-11-8 10:46
野火 发表于 2012-11-8 08:53
试过的啊……

K60不是有片选控制寄存器吗,那为什么NRF24L01的片选用的是GPIO口控制片选啊?求解释,谢谢

作者: 野火    时间: 2012-11-8 13:24
loucyin 发表于 2012-11-8 10:46
K60不是有片选控制寄存器吗,那为什么NRF24L01的片选用的是GPIO口控制片选啊?求解释,谢谢 ...

因为GPIO更加灵活……

作者: whenov    时间: 2012-11-8 14:31
野火 发表于 2012-11-8 08:53
试过的啊……

就是手动切换发送模式和接受模式?有例程提供吗?
网上有人说可以在应答包里携带数据,是真是假?
问题有点多。。。谢谢



作者: 野火    时间: 2012-11-8 15:14
whenov 发表于 2012-11-8 14:31
就是手动切换发送模式和接受模式?有例程提供吗?
网上有人说可以在应答包里携带数据,是真是假?
问题 ...

是必须要手动切换的,我们的函数库已经实现这功能,只不过例程仅仅用了单向传输

自动应答的时候,如果 TX_PLD  FIFO 有数据,就会自动把他发送出去


作者: shiyuanpeng    时间: 2012-11-9 05:33
想问下硬件SPI和NRF2401哪些需要注意的,我就直接拿模拟IO的修改。。但是始终不行。。不太明白。。发送完要读就读不了。SPI0SR_SPIF总是自动清空的。。好怪!
作者: loucyin    时间: 2012-11-9 09:18
shiyuanpeng 发表于 2012-11-9 05:33
想问下硬件SPI和NRF2401哪些需要注意的,我就直接拿模拟IO的修改。。但是始终不行。。不太明白。。发送完要 ...

楼上是大神,问楼上的

作者: 野火    时间: 2012-11-9 18:30
shiyuanpeng 发表于 2012-11-9 05:33
想问下硬件SPI和NRF2401哪些需要注意的,我就直接拿模拟IO的修改。。但是始终不行。。不太明白。。发送完要 ...

主要是SPI驱动没写好吧?
发送完要读就读不了??

飞思卡尔的SPI,是不太稳定的,我当时是用示波器来对比时序调的


作者: shiyuanpeng    时间: 2012-11-9 19:44
野火 发表于 2012-11-9 18:30
主要是SPI驱动没写好吧?
发送完要读就读不了??

SPI驱动?while(!SPI0SR_SPTEF); SPI0DRL =(byte)Chr;读数据,而且我这边的SPI连线还是用飞线飞来飞去的。。我感觉时序因为这些原因对不上。还要用示波器对时序啊。。怎么对。。还有一个问题:用BDM调试过程中,单步运行,那个接受函数跳不过去。一直在死循环里,全速运行就可以跑过。这是为什么。。

作者: 野火    时间: 2012-11-9 20:45
shiyuanpeng 发表于 2012-11-9 19:44
SPI驱动?while(!SPI0SR_SPTEF); SPI0DRL =(byte)Chr;读数据,而且我这边的SPI连线还是用飞线飞来飞去的。 ...

这些寄存器配置问题,不在现场调试,我也很难说得出原因

单步执行过不了,全速能过,很正常,调模块的时候是经常出现的……所以此时尽量不单步


作者: jianbo2006    时间: 2012-12-15 00:04
你好,楼主,我想问一下spi的串口的波特率你设置的是多少?
作者: owenpcf1    时间: 2013-1-29 21:30
野火 发表于 2012-11-6 21:43
我们已经开源了 用内部SPI模块来驱动的了……首家独家 开源的 K60 内部 SPI模块控制NRF24L01+……网上搜 ...

请问这些代码s12xs128能用,是不是改改对应的SPI寄存器设置就行,24L01那部分的代码是通用的?

作者: owenpcf1    时间: 2013-1-29 21:52
野火 发表于 2012-11-9 18:30
主要是SPI驱动没写好吧?
发送完要读就读不了??

那是不是用IO去模拟时序比本来的SPI模块还稳定?模拟时序会不会加重MCU的负担?

作者: 寒窗乍暖    时间: 2013-3-8 15:13
野火 发表于 2012-11-6 21:43
我们已经开源了 用内部SPI模块来驱动的了……首家独家 开源的 K60 内部 SPI模块控制NRF24L01+……网上搜 ...

请问野火大哥,用NRF无线模块传输图像的分辨率怎么从80*60改到160*120呀,急急急
作者: 野火    时间: 2013-3-8 15:54
寒窗乍暖 发表于 2013-3-8 15:13
请问野火大哥,用NRF无线模块传输图像的分辨率怎么从80*60改到160*120呀,急急急

可以直接修改宏定义,即ov7725.h 里定义高度和宽度
记得接收端也要修改,否则接收不了


作者: 野火    时间: 2013-3-8 15:58
owenpcf1 发表于 2013-1-29 21:52
那是不是用IO去模拟时序比本来的SPI模块还稳定?模拟时序会不会加重MCU的负担?

稳不稳定,看个人写的代码吧……
模拟IO,肯定会加重CPU负担,但影响不会太大


作者: xuezihan    时间: 2013-3-11 23:00

作者: 透过雨滴的光    时间: 2013-5-13 16:43
NRF240L能实现全双功通信吗

作者: 腾曦    时间: 2013-7-5 03:05
为什么我用的时候总是会停在检测是否插入24L01模块的死循环中呢,明明线连接好了
作者: ch0ngbo    时间: 2013-7-14 13:18
腾曦 发表于 2013-7-5 03:05
为什么我用的时候总是会停在检测是否插入24L01模块的死循环中呢,明明线连接好了

SPI通道没有设置好吧

作者: GUK    时间: 2015-3-9 17:21
***,为啥不用SPI加中断服务函数来处理呢,这样移植多方便:(:(
作者: GUK    时间: 2015-3-9 21:30
野火 发表于 2012-11-6 21:43
我们已经开源了 用内部SPI模块来驱动的了……首家独家 开源的 K60 内部 SPI模块控制NRF24L01+……网上搜 ...

多少人会因为用无线模块再买一块K60啊

作者: 布鲁克博    时间: 2015-3-16 22:24
:$
作者: 小熊仔    时间: 2015-3-31 11:13
可以双向通讯吗





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2