515135896 发表于 2012-10-27 11:12:13

STC12C5A 硬件SPI控制 NRF24L01

最近在做一个无线对讲系统,无线通信模块儿为24L01.主控为STC12C5A60S2.
24L01为spi通信,用12C5A模拟了SPI读写函数,无线正常收发,函数如下:
uchar SPI_RW(uchar byte)
{
        uchar bit_ctr;
           for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
           {
                MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI
                byte = (byte << 1);         // shift next bit into MSB..
                SCK = 1;                      // Set SCK high..
                byte |= MISO;                         // capture current MISO bit
                SCK = 0;                              // ..then set SCK low again
           }
    return(byte);                           // return read byte
}

我想,既然12C5A有硬件SPI,就应该用上,于是写了SPI函数如下:
void spi_init(unsigned char n) //STC 硬件SPI初始化,n为分频数,影响SPI的通信速度
{
        switch(n)
        {
       case 4:    SPCTL=0xfc;   break;
       case 16:SPCTL=0xfd;   break;
       case 64:SPCTL=0xfe;   break;
       case 128:SPCTL=0xff;    break;
        }
        SPSTAT=0xc0;
}
uchar SPI_RW(uchar x)
{
        SPDAT=x;
        while(!(SPSTAT&0x80));
        SPSTAT=0xc0;
        return SPDAT;
}

SPI初始化CPUclk的128分频,大约170k左右,但是通信不成功……
请大师帮忙分析一下原因可能在哪呢?

luomeigang 发表于 2012-10-30 12:53:01

不一定要使用单片机的SPI口,可以采用IO口直接模拟SPI通信。不分频直接使用单片机的频率。我使用STC12LE5A48S2控制NRF24L01+通信完全成功,NRF24L01+也NRF24L01没有太大的区别,可以兼容。

515135896 发表于 2012-11-5 14:35:13

硬件SPI与软件相比较,速度上有极大的优势

celticzy 发表于 2012-11-5 15:15:36

515135896 发表于 2012-11-5 14:35 static/image/common/back.gif
硬件SPI与软件相比较,速度上有极大的优势

看有没有速度要求,io模拟出来的波形很好。

515135896 发表于 2012-11-6 21:59:00

celticzy 发表于 2012-11-5 15:15 static/image/common/back.gif
看有没有速度要求,io模拟出来的波形很好。

实时语音通信,速度有要求……

fmdz 发表于 2012-11-6 23:16:04

配置一下SPI寄存器就行了,MCU设置成主机,把模块的MISOMOSISCLK与单片机的硬件连接起来 ,无线模块的CSNCEIRQ 使用IO控制。
寄存器的具体配置为:SPCTL=0xd0;(主频的四分之一)

fmdz 发表于 2012-11-6 23:17:12

顺便说一下0dbm的功率在2Mbps下通讯距离和音质不要期望太高

515135896 发表于 2012-11-7 10:57:56

fmdz 发表于 2012-11-6 23:17 static/image/common/back.gif
顺便说一下0dbm的功率在2Mbps下通讯距离和音质不要期望太高

感谢fmdz兄!!!

fmdz 发表于 2012-10-27 11:12:14

#define        SPIF                        0x80                //SPI传输完成标志。写入1清0。
#define        WCOL                        0x40                //SPI写冲突标志。写入1清0。

SPCTL=0xd0;                         //开启硬件SPI

SPSTAT = 0xC0;                        //清0 SPIF和WCOL标志
SPDAT = SPI_Data;                        //发送一个字节
while(!(SPSTAT & SPIF));                //等待发送完成

182841146 发表于 2013-5-1 06:21:24

楼主好,我也在用STC12控制NRF24L01做无线通信,敢问楼主的程序能不能借鉴一下,我的程序普通51能工作,换成STC12C5A就不能跑了,该怎么解决好?

515135896 发表于 2013-5-1 10:32:31

182841146 发表于 2013-5-1 06:21 static/image/common/back.gif
楼主好,我也在用STC12控制NRF24L01做无线通信,敢问楼主的程序能不能借鉴一下,我的程序普通51能工作,换 ...

STC12C5A比普通的单片机速度快一下
把你原来24L01程序里的延时重新写一下(用示波器看一下,比较靠谱),应该就没什么问题了

bbssilverkey 发表于 2013-5-14 17:31:19

我向问问逻辑电平转换的问题怎么解决的?还是直接就串个电阻了事了

515135896 发表于 2013-5-21 07:34:53

bbssilverkey 发表于 2013-5-14 17:31 static/image/common/back.gif
我向问问逻辑电平转换的问题怎么解决的?还是直接就串个电阻了事了

没做处理,3.3v供电,其他直接互连。
用着倒是没事,不知道合理不……

lwr91 发表于 2013-9-11 17:16:05

楼主,您好, 我写的SPI程序和楼主一样,为什么在一个寄存器写一个数,然后再去读这个寄存器,通过串口发到pc上之后却不是刚才写的那个数。。而且我发现它一直在等SPIF
页: [1]
查看完整版本: STC12C5A 硬件SPI控制 NRF24L01