㈠ 我用MSP430F437单片机与CC1100无线模块在SPI模式下进行收发,程序怎么写,主要是CC1100初始化和驱动
不知道是否是寄存器配置问题:
//////////////////////////////////////////////////////////////////明顷////
unsigned char const PaTabel[8]={0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0};
//功率配置
///////////////////////////////////////////////////宏槐锋///////////////////
//结构体变量赋值
//////////////////////////////////////////////////////////////////////
const RF_SETTINGS rfSettings = {
0x00, //FSCTRL2
0x0B, //FSCTRL1
0x00, //FSCTRL0
0x10, //FREQ2
0xA7, //FREQ1
0x62, //FREQ0
0x2D, //MDMCFG4
0x3B, //MDMCFG3
0x73, //MDMCFG2
0x22, //MDMCFG1
0xF8, //MDMCFG0
0x00, //CHANNR
0x00, //DEVIATN
0xB6, //FREND1
0x10, //FREND0
0x18, //MCSM0
0x1D, //FOCCFG
0x1C, //BSCFG
0xC7, //AGCCTRL2
0x00, //AGCCTRL1
0xB2, //AGCCTRL0
0xEA, //FSCAL3
0x0A, //FSCAL2
0x00, //FSCAL1
0x11, //FSCAL0
0x59, //FSTEST
0x88, //TEST2
0x31, //TEST1
0x0B, //TEST0
0x0B, //IOCFG2
0x06, //IOCFG0
0x04, //PKTCTRL1
0x05, //PKTCTRL0
0x00, //ADDR
0x0C, //PKTLEN
};
用CC2500的2.4G无线模块做两个单片机的通讯,但是我的用单片机没有外部中断,不能通过接收到数据后GDO0脚的信号来判断接收结束,我该怎么样判断接收结束?之前测试时设置GDO0=0x06,用等待GDO0信号的方法已经调试好收发通讯了,但是实际应用中MCU还要做其他事情,不能让它一直在等待,而我用的单片机又没有外部中断蔽晌,不能用触发外部中断的方法实现。我也有试过不管GDO0信号每隔一段时间去读一次RX FIFO,但是读出来的数据根本不对,只有在收到GDO0信号后去读RX FIFO才能读到正确的发送数据,请问到底怎样才能读到正确的数据,是我的方法不对还是这样的方法根本行不通,那么又有什么方法不通过GDO0信号能读到正确的数据呢?
㈡ 新手请问师傅们我该如何通过spi读写这个单片机内FLASH
按写的这个顺序来操作啊。
先在偏移02h的寄存器写好地址、在偏移03h的寄存器写好数据,
然后向04h、05h写入A5h、C3h解开写保护,
接着向00h依次写入58A9h和A958h解锁FLASH操作,
然后改写01h寄存器的第4位到第2位,写入FLASH操作命令,并将第0位置1,启动操作,
回读01h寄存器直到第0位变成0,表明操作完成,
㈢ 怎么实现单片机和PC机进行SPI通讯
实现单片机和PC机进行SPI通讯方法:
1:电路设计
设计的电路,利用两片AT89C52芯片,一片做为发送模块,一片做为接收模块。分别编写发送和接收程序,实现数据的发送和接受。通过LED显示接收到的数据。通过示波器观察输出的波形。
2:编写程序
根据设计好的电路及题目要求分别编写数据发送程序和数据接收程序。 ①:数据发送程序 #define
uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//--------------------------- #include <REG52.H>
#include<STDIO.H>
//--------------------------- sbit SPICLK = P1^0; //时钟信号 sbit MOSI = P1^1; //主器件数据输出,从器件数据输入 sbit MISO = P1^2; //主器件数据输入,从器件数据输出
sbit SS = P1^3; //从器件使能信号
void Dat_Transmit(uchar dat) //发送数据程序
{ uchar i,datbuf;
datbuf=dat;
SS=1; while(SS){;} for(i=0;i<8;i++) {
while(SPICLK){;} if(datbuf&0x80) MISO=1; else
MISO=0;
datbuf=(datbuf<<1); while(~SPICLK){;}
}
}
void main(void)
{ uchar i; while(1) {
for(i=0;i<10;i++) {
Dat_Transmit(i);
}
}
}
②:数据接收程序 #define uchar unsigned char
#define uint unsigned int #define ulong
unsigned long
//--------------------------- #include <REG52.H>
#include<STDIO.H>
//--------------------------- sbit SPICLK = P1^0; //时钟信号 sbit MOSI = P1^1; //主器件数据输出,从器件数据输入 sbit MISO = P1^2; //主器件数据输入,从器件数据输出 sbit SS = P1^3; //从器件使能信号
//--------------------------- void Nop(void)
{ ;
}
void Delay(uchar t) { while(t--){;}
}
uchar Data_Receive(void) //数据接收程序
{ uchar i,dat=0,temp; bit
bt;
SPICLK=1; MISO=1; SS=0;
//选中器件
Nop(); Nop();
for(i=0;i<8;i++) { SPICLK=1;
Nop()
Nop(); Nop(); SPICLK=0; Nop(); Nop();
bt=MISO; if(bt)
temp=0x01;
else
temp=0x00;
dat=(dat<<1);
dat=(dat|temp);
}
SS=1; SPICLK=1;
return dat;
}
void main(void)
{ uchar exdat; uchar i=0;
uchar code
table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F}; P2=0;
while(1) { exdat=Data_Receive(); P0=table[exdat];
for(i=0;i<200;i++)
Delay(200);
}
}
3:电路仿真
将数据发送程序生成的HEX文件载入到发送数据的模块,将数据接收程序生成的HEX文件载入到接收数据的模块。在输出端口连接LED灯等到输出信息,利用示波器观察输出波形。
4:SPI总线简介
SPI ( Serial Peripheral Interface ——串行外设接口) 总线是Motorola公司推出的一种同步串行接口技术。SPI总线系统是一种同步串行外设接口,允许MCU(微控制器)与各种外围设备以串行方式进行通信、数据交换。外围设备包括FLASHRAM、A/ D 转换器、网络控制器、MCU 等。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。其工作模式有两种:主模式和从模式。SPI是一种允许一个主设备启动一个从设备的同步通讯的协议,从而完成数据的交换。也就是SPI是一种规定好的通讯方式。这种通信方式的优点是占用端口较少,一般4根就够基本通讯了(不算电源线)。同时传输速度也很高。一般来说要求主设备要有SPI控制器(也可用模拟方式),就可以与基于SPI的芯片通讯了。
利用SPI总线可在软件的控制下构成各种系统。如1个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可使用1个MCU作为主控机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。其数据的传输格式是高位(MSB)在前,低位(LSB)在后。
当一个主控机通过SPI与几种不同的串行I/O芯片相连时,必须使用每片的允许控制端,这可通过MCU的I/O端口输出线来实现。但应特别注意这些串行I/O芯片的输入输出特性:首先是输入芯片的串行数据输出是否有三态控制端。平时未选中芯片时,输出端应处于高阻态。
若没有三态控制端,则应外加三态门。否则MCU的MISO端只能连接1个输入芯片。其次是输出芯片的串行数据输入是否有允许控制端。因为只有在此芯片允许时,SCK脉冲才把串行数据移入该芯片;在禁止时,SCK对芯片无影响。若没有允许控制端,则应在外围用门电路对SCK进行控制,然后再加到芯片的时钟输入端;当然,也可以只在SPI总线上连接1个芯片,而不再连接其它输入或输出芯片。
SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。
5:SPI总线工作原理
SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI有三个寄存器分别为:控制寄存器SPCR,状态寄存器SPSR,数据寄存器。外围设备、网络控制器、LCD显示驱动器、A/D转换器和MCU等。
接口包括以下四种信号:
(1)MOSI – 主器件数据输出,从器件数据输入;
(2)MISO – 主器件数据输入,从器件数据输出;
(3)SCLK – 时钟信号,由主器件产生;
(4) SS –从器件使能信号,由主器件控制,有的IC会标注为CS(Chip select)。 在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。