打印

关于CC2440的SPI

[复制链接]
2700|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nightmara|  楼主 | 2009-7-6 21:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问大家一个SPI的问题,我用ARM和CC2420通过SPI通讯,ARM为主,ARM给CC2420一个数据时,cc2420返回3个字节数据,如果这时我用SPI接收一个字节的话,那么这个字节应该是CC2420发的哪个字节啊(SPI有8位的接收和8位的发送缓存),下面连接是CC2420的时序图(上面的说明是针对其中的第三个Read from
register/RXFIFO),怎么能确保能可靠的接收到这3个字节数据

相关帖子

沙发
chunyang| | 2009-7-7 16:24 | 只看该作者

数据的具体定义根据你发送指令的不同而不同

是否可靠接收则由你的ARM程序决定,注意先弄懂该二芯片的手册,从你的问题可以看出,你对手册的掌握还差的太远。

使用特权

评论回复
板凳
nightmara|  楼主 | 2009-7-7 20:17 | 只看该作者

关于CC2440的SPI

谢谢斑竹回复,现在关于CC2420的时序图已经看懂了,程序也做了修改。
用S3C2440的SPI和CC2420通信,我向寄存器中写数据,再想往出读,检测一下通信好不好用,可是总读不出我写的数据
下面是CC2420寄存器读写程序:
unsigned char CC2420_SetReg( char reg, unsigned short data)
{
char H_byte,L_byte;
H_byte=((data&0xFF00)>>8);
L_byte=(data&0x00FF);
CC2420_CS_ENABLE;
/* Write the address to the SPI */
WRITE_SPI(reg);     
/* Write the data to the spi, stop if there was a SPI error */
WRITE_SPI(H_byte);
WRITE_SPI(L_byte);
CC2420_CS_DISABLE;
return ( 0 ); }

unsigned char CC2420_ReadReg( char reg, char* data, unsigned char length )
{
char pos = 0;
CC2420_CS_ENABLE;
/* Write the address to the SPI */
WRITE_SPI((reg & 0x3F) | 0x40); 
/*读数据*/
WRITE_SPI(0xff);
RX[0]=Read_SPI(); 
WRITE_SPI(0xff);
RX[1]=Read_SPI();
CC2420_CS_DISABLE;
return ( 0 ); 
}
下面是S3C2440的SPI的程序:
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "cc2420.h"

void spi_poll_done(void);

char RXdata[],TXdata[],test=0;
extern char RX[4];
/************SPI的初始化程序*************
    GPG2-----nSS0     GPE11-----MISO    
    GPE12----MOSI     GPE13-----SPICLK
    GPG0-----VREG_EN  GPG6------RSTn 
    GPG10-----SFD     GPG7------CCA     
    GPG11----FIFO     GPG5-----FIFO_P  
    GPG1-----CSn
*****************************************/
void Init_SPI(void)
   {
    int t;
     //初始化相关io端口设置
     rGPECON=rGPECON&~(3<<22)&~(3<<24)&~(3<<26)|(2<<26)|(2<<24)|(2<<22);//SPI0 configued 
     rGPGCON=rGPGCON&~(3<<10)&~(3<<14)&~(3<<22)&~(3<<20)&~(3<<0)&~(3<<12)&~(3<<2)|(1<<0)|(1<<12)|(1<<2);
     //nSS0 bit is input,GPG2->nSS0,直接接地

     rGPGUP=(~(1<<1));   //disable GPG pull up function,只使能CSn的上拉
     rGPEUP=0xffff;     //disable GPE pull up function
     
     //初始化SPI设置
     rSPPRE0=0x18;          //PCLK=50M,SPICLK=50/2/(24+1)=1M
     //rCLKCON|=(1<<18);     //使能SPI的时钟模块
     rSPCON0=(1<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0);//enable ENSCK,master,CPOL=0,CPHA=0,normal mode
     rSPPIN0=(0<<2)|(1<<1)|(0<<0);                //dis-ENMUL,SBO,release    
     for(t=0;t<10;t++)
     rSPTDAT0=0xff;       //初始化设备
  }
  
/************SPI发送一个字节**************/
void WRITE_SPI(unsigned char data)
   {
   spi_poll_done();
   rSPTDAT0=data;
   spi_poll_done();
   }
/**************轮询SPI状态***************/
void spi_poll_done(void)
   {
    while(!(rSPSTA0&0x01));  //SPSTA0的READY是否置位
    }
    
/**************SPI接收数据***************/
char Read_SPI(void)
   {
    RXdata[0]=rSPRDAT0;
    return(RXdata[0]);
    
   }

弄了将近一个星期了,还是读不出来我写的数据,希望用过SPI和CC2420的朋友给点建议,或者给我S3C2440的SPI的例程也行,感激不尽

使用特权

评论回复
地板
chunyang| | 2009-7-7 21:05 | 只看该作者

借助示波器或万用表分别监测SPI的输入输出

如果有数字存储示波器当然更方便,用此来判断是你的发送程序还是接收程序的问题。

使用特权

评论回复
5
nightmara|  楼主 | 2009-7-7 23:52 | 只看该作者

谢谢,我明天试一试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

95

帖子

0

粉丝