新人第一次发帖,还望大虾们给予指点,多谢。
最近闲来无事就想做个无线图像拍照的东东(本来想做视频,但速度不够,呵呵),由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;
}
}
} |