打印

C8051与PTR8000的通信问题

[复制链接]
2116|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xsjkiver|  楼主 | 2011-11-4 10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新人第一次发帖,还望大虾们给予指点,多谢。
最近闲来无事就想做个无线图像拍照的东东(本来想做视频,但速度不够,呵呵),由C8051F340拍照并将数据由PTR8000发送到cortex-M3解码显示(目前已实现拍照及解码显示的功能),可现在C8051F340与PTR8000一直通信不了(使用硬件SPI接口),我用IO口模拟SPI时序却可以通信,困扰了我好久:( ,下面是主要的代码,希望大虾们给予指点。
/*************Main.c***********************/
void SYS_Init(void)
{
PCA0MD    = 0x00;  //关闭看门狗
//OSCICN    = 0x83;
CLKMUL    = 0x00;  //复位四倍时钟乘法器
CLKMUL   |= 0x80;  //内置时钟输入(12MHz)并使能四倍时钟乘法器
delay_10us();
CLKMUL   |= 0xC0;  //初始化四倍时钟乘法器
while(!(CLKMUL&0x20));//查询四倍时钟乘法器准备好
CLKSEL    = 0x02;  //系统时钟24MHZ(4倍乘法器2分频)
XBR1      = 0x40;   //使能交叉开关
}
extern void SPI0_Init(void);
extern void PTR_Init(void);
extern void TxPacket(unsigned char Data);
extern void Wait_Rec_Packet(void);
void main(void)
{
SYS_Init();
SPI0_Init();
//UART_Init();
PTR_Init();
while(1)
{
        Wait_Rec_Packet();
        switch(Com[0])
       {
            case 'A':
            TxPacket('A');                  break;
            default :
            break;
        }
  }

}
/////////////////////////////////////////////////////////////////////

/***********SPI.c********************/
///////////延时/////////////////
void Delay(unsigned int x)
{
    unsigned int i;
    for(i=0;i<x;i++){
        _nop_();
    }
}
void SPI0_Init(void)
{

    XBR0      = 0x02;     //映射SPI引脚
    EA        = 1   ;
    ESPI0     = 0   ;        
    SPIEN     = 1   ;
    SPI0CFG   = 0x40;     //SPI主方式,时钟SCK极性及相位为00

    NSSMD1    = 1   ;
    NSSMD0    = 1   ;
    SPI0CKR   = 0x0B;  //SPI速率1MHz
    //SPIF      = 0   ;
  
}
unsigned char SPI0_RW_Byte(unsigned char Data)
{
      //ESPI0     = 0   ;
      unsigned char temp;
      SPI0DAT=Data;
      while(!SPIF);
      temp=SPI0DAT;
      SPIF=0;
      return temp;
      //ESPI0     = 1   ;
}
void SPI0_SendBytes(unsigned char len,unsigned char *Data)
{
    unsigned char i;
   //ESPI0     = 0   ;
   for(i=0;i<len;i++)
   {
       //SPI0DAT=*Data;
       //while(!TXBMT);

      SPI0DAT=*Data;
      while(!SPIF);
      SPIF=0;
      //Delay(2);
      Data++;
      //
   }
   //while(!SPIF);
   //SPIF=0;
   //ESPI0     = 1   ;
}
/////////////////////////////////////////////////////////////

/***********PTR8000.C*********************/

sbit LED_CD = P2^0;
sbit LED_AM = P2^1;
sbit LED_DR = P2^3;           //指示灯
extern unsigned char Com[5];
extern void Delay(unsigned int x);
extern unsigned char SPI0_RW_Byte(unsigned char Data);
extern void SPI0_SendBytes(unsigned char len,unsigned char *Data);
//NRF寄存器配置//
unsigned char RFConf[11]=
{
    0x00,        //配置命令//
    0x6C,        //CH_NO,配置频段在433.2MHZ
    0x0C,        //输出功率10db,不重发,节电为正常模式
    0x44,        //地址宽度设置为4字节
    0x01,0x01,    //接收发送有效数据长度1字节
    0xE7,0xE7,0xE7,0xE7,    //接收地址
    0x58        //CRC校验16M晶振
};
////////////初始化配置寄存器////////////////
void PTR_Init(void)
{
     //unsigned char i;
     NSSMD0    = 1   ;
     TRX_CE=0;
     PWR=1;
     TXEN=0;                            //待机模式
     Delay(10000);
     NSSMD0    = 0   ;                 //使能SPI数据传输
     Delay(10);
    //SPI0_RW_Byte( 0x00);        //配置命令//
    //SPI0_RW_Byte( 0x6C);        //CH_NO,配置频段在433.2MHZ
    //SPI0_RW_Byte( 0x0C);        //输出功率为10db,不重发,节电为正常模式
    //SPI0_RW_Byte( 0x44);        //地址宽度设置,为4字节
    //SPI0_RW_Byte( 0x01);SPI0_RW_Byte( 0x01);    //接收发送有效数据长度为1字节
    //SPI0_RW_Byte( 0xE7);SPI0_RW_Byte( 0xE7);SPI0_RW_Byte( 0xE7);SPI0_RW_Byte( 0xE7);//接收地址
    //SPI0_RW_Byte( 0x58);
    //Delay(10);
  
SPI0_SendBytes(11,RFConf);
Delay(5);
    NSSMD0    = 1   ;
    Delay(10);
    //NSSMD0    = 0   ;
//Delay(5);
//Read_RFConf();
//Delay(5);
    //NSSMD0    = 1   ;
    //Delay(5);
}
///////////////接收数据包/////////////////
void RxPacket(void)
{
    unsigned char i=0;
    SPI0_RW_Byte(0x24);              //SPI读
    while(DR)
    {
        Com[i]=SPI0_RW_Byte(0x00);
        i++;
    }
}
/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
void TxPacket(unsigned char Data)
{   
    TRX_CE=0;
    PWR=1;
    TXEN=1;
    NSSMD0    = 0   ;
Delay(5);
    SPI0_RW_Byte(0x22);        //写发送地址,后面跟4字节地址//
    SPI0_RW_Byte(0xE7);
    SPI0_RW_Byte(0xE7);
    SPI0_RW_Byte(0xE7);
    SPI0_RW_Byte(0xE7);
Delay(5);
    NSSMD0    = 1   ;
    Delay(5);
    NSSMD0    = 0   ;
Delay(5);
    SPI0_RW_Byte(0x20);        //写发送数据命令,后面跟三字节数据//
    SPI0_RW_Byte(Data);
Delay(5);
   
    NSSMD0    = 1   ;
    Delay(5);
    TRX_CE=1;                    //使能发射模式//
    Delay(1000);
while(!DR);                    //等带发送完成//
    TRX_CE=0;
    Delay(10000);//
}
////////////////等待接收数据包///////////////////
void Wait_Rec_Packet(void)
{
unsigned char temp=0;
    TXEN=0;
    TRX_CE=1;
    PWR=1;
Delay(1000);
//LED_DR=1;
    while(1)
    {
        if(LCD) {LED_CD=0;}
        if(AM)  {LED_AM=0;}
        if(DR)
        {
              TRX_CE=0;            //如果数据准备好,则进入待机模式,以便SPI口操作
              Delay(20);
              NSSMD0    = 0   ;
              Delay(10);            
              RxPacket();              //读数据
              NSSMD0    = 1   ;
              Delay(200);
              LED_DR=0;LED_CD=1;LED_AM=1;
              break;
        }
    }
}

相关帖子

沙发
xsjkiver|  楼主 | 2011-11-4 15:54 | 只看该作者
问题补充:可能我没有说清楚,出现的问题在SPI通信上,配置信息根本写不到NRF905内。

使用特权

评论回复
板凳
yeyifeifei| | 2012-12-2 23:21 | 只看该作者
楼主 请问你这个模块调好了吗 我现在在做用C8051F340的IO口模拟SPI与nrf905通信 一直写不进去 不知道为什么

使用特权

评论回复
地板
wang5322178| | 2013-4-27 15:58 | 只看该作者
我也想问下楼主,SPI通信成功了吗?现在好纠结的问题也落在我身上了。

使用特权

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

本版积分规则

1

主题

34

帖子

1

粉丝