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左右,但是通信不成功……
请大师帮忙分析一下原因可能在哪呢? 不一定要使用单片机的SPI口,可以采用IO口直接模拟SPI通信。不分频直接使用单片机的频率。我使用STC12LE5A48S2控制NRF24L01+通信完全成功,NRF24L01+也NRF24L01没有太大的区别,可以兼容。 硬件SPI与软件相比较,速度上有极大的优势 515135896 发表于 2012-11-5 14:35 static/image/common/back.gif
硬件SPI与软件相比较,速度上有极大的优势
看有没有速度要求,io模拟出来的波形很好。 celticzy 发表于 2012-11-5 15:15 static/image/common/back.gif
看有没有速度要求,io模拟出来的波形很好。
实时语音通信,速度有要求…… 配置一下SPI寄存器就行了,MCU设置成主机,把模块的MISOMOSISCLK与单片机的硬件连接起来 ,无线模块的CSNCEIRQ 使用IO控制。
寄存器的具体配置为:SPCTL=0xd0;(主频的四分之一) 顺便说一下0dbm的功率在2Mbps下通讯距离和音质不要期望太高 fmdz 发表于 2012-11-6 23:17 static/image/common/back.gif
顺便说一下0dbm的功率在2Mbps下通讯距离和音质不要期望太高
感谢fmdz兄!!! #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)); //等待发送完成 楼主好,我也在用STC12控制NRF24L01做无线通信,敢问楼主的程序能不能借鉴一下,我的程序普通51能工作,换成STC12C5A就不能跑了,该怎么解决好? 182841146 发表于 2013-5-1 06:21 static/image/common/back.gif
楼主好,我也在用STC12控制NRF24L01做无线通信,敢问楼主的程序能不能借鉴一下,我的程序普通51能工作,换 ...
STC12C5A比普通的单片机速度快一下
把你原来24L01程序里的延时重新写一下(用示波器看一下,比较靠谱),应该就没什么问题了
我向问问逻辑电平转换的问题怎么解决的?还是直接就串个电阻了事了 bbssilverkey 发表于 2013-5-14 17:31 static/image/common/back.gif
我向问问逻辑电平转换的问题怎么解决的?还是直接就串个电阻了事了
没做处理,3.3v供电,其他直接互连。
用着倒是没事,不知道合理不…… 楼主,您好, 我写的SPI程序和楼主一样,为什么在一个寄存器写一个数,然后再去读这个寄存器,通过串口发到pc上之后却不是刚才写的那个数。。而且我发现它一直在等SPIF
页:
[1]