📄 se300.c
字号:
/***************************************************************
功能:实现存储器EEPROM AT45db081的数据读写操作,同时了解硬件spi读写操作
作者:ZDP
时间:2005-11-30
版本:V1.0
***************************************************************/
#include <c8051f020.h>
#include <stdio.h>
#include <intrins.h>
unsigned int Count1msInc;
void SYSCLK_Init (void);
void PORT_Init (void);
void SPI0_Init (void);
void Timer0_Init (void);
void SendSPIByte(unsigned char ch);
unsigned char GetSPIByte(void);
void recevercommend(void);
void sendcommend(void);
//#define SYSCLK 11059200
#define SYSCLK 24000000
#define CIIF_ADDR 0x4000
#define CAM_ADDR 0x8000
unsigned char xdata cpld_addr[4] _at_ CIIF_ADDR;
unsigned char xdata cam_addr[1024] _at_ CAM_ADDR;
unsigned int xdata camcpldaddr;
unsigned char xdata sdata[4];
unsigned char xdata MyRecBuff[128];
unsigned char xdata MySendBuff[512];
unsigned char xdata commendstat;
unsigned char xdata ver[12]={"ver 0.0.0.1"};
void main (void)
{
unsigned int i;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
SYSCLK_Init (); // initialize oscillator
Timer0_Init();
PORT_Init (); // initialize crossbar and GPIO
EA=1;
SPI0_Init (); // initialize SPI0
while(1)
{
recevercommend();
if(commendstat==1)
{
commendstat=0;
switch (MyRecBuff[1])
{
//read config
case 0xc0:
MySendBuff[0] = 12;
for(i=0;i<12;i++)
{
MySendBuff[i+1]=ver[i];
}
sendcommend();
break;
case 0xc1:
MySendBuff[0] = 64;
cpld_addr[0]&=0xf3;
camcpldaddr = (MyRecBuff[3]<<8)+MyRecBuff[2];
for (i = 0;i<64;i++)
{
MySendBuff[i+1]=cam_addr[camcpldaddr+i];
if( cpld_addr[0]&0x01==0) //modfiy 2007/9/11
MySendBuff[i+1]=0xFF;
}
sendcommend();
break;
//write config
case 0xc2:
camcpldaddr = (MyRecBuff[3]<<8)+MyRecBuff[2];
cam_addr[camcpldaddr]=MyRecBuff[4];
sdata[0]=cpld_addr[0]&0xf3;
sdata[0]|=0x04;
cpld_addr[0]=sdata[0];
MySendBuff[0] = 0;
sendcommend();
break;
//read common io
case 0xc3:
camcpldaddr = MyRecBuff[2];
MySendBuff[0]=2;
MySendBuff[1]=cpld_addr[0]&0x01; //modfiy 2007/9/11
MySendBuff[2]=cam_addr[camcpldaddr];
sendcommend();
break;
//write common io
case 0xc4:
camcpldaddr = MyRecBuff[2];
cam_addr[camcpldaddr]=MyRecBuff[4];
MySendBuff[0] = 0;
sendcommend();
break;
//detect cam
case 0xc5:
sdata[0]=cpld_addr[0]&0x01;
MySendBuff[0] = 1;
MySendBuff[1] = sdata[0];
sendcommend();
break;
//rest cam 1
case 0xc6:
sdata[0]=cpld_addr[0]&0xbf;
sdata[0]|=(MyRecBuff[2]<<6);
cpld_addr[0]=sdata[0];
MySendBuff[0] = 0;
sendcommend();
break;
//cpld bypass 0
case 0xc7:
sdata[0]=cpld_addr[0]&0xdf;
sdata[0]|=(MyRecBuff[2]<<5);
cpld_addr[0]=sdata[0];
MySendBuff[0] = 1;
MySendBuff[1] = cpld_addr[0];
sendcommend();
break;
//cam rest finish
case 0xc8:
sdata[0]=cpld_addr[1]&0x01;
MySendBuff[0] = 1;
MySendBuff[1]=sdata[0];
sendcommend();
break;
default:
break;
}
}
_nop_();
}
}
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 24.000MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
}
void PORT_Init (void)
{
XBR0 = 0x06; // Enable SMBus, SPI0
XBR1 = 0x84; // Enable sysclk out
XBR2 = 0x40; // Enable crossbar and weak pull-ups
EMI0TC = 0xFF;
EMI0CF = 0x34; // p5 p6 p7
P74OUT = 0xFF; //p5 p6 p7 端口引脚的输出方式为推挽
P0MDOUT = 0x15;
P0MDOUT |= 0x80; //clk 端口引脚的输出方式为推挽
}
void SPI0_Init (void)
{
SPI0CFG = 0x07; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CFG|=0xC0; //CKPOL =1;
SPI0CN &= ~0x02; // 禁止 Master mode; SPI enabled; flags
// SPI0CN |= 0x02; // Master mode; SPI enabled; flags
SPI0CN |= 0x01; // 使能 SPI0
SPI0CKR = SYSCLK/2/2000000-1; // SPI clock <= 8MHz (limited by
// EEPROM spec.)
}
//接受命令
unsigned char GetSPIByte(void)
{
SPI0DAT = 0;
// Count1msInc=0;
// while (SPIF == 0 && Count1msInc<100); // 等待写结束
while (SPIF == 0 ); // 等待读结束
SPIF = 0;
return SPI0DAT;
}
void recevercommend(void)
{
unsigned int rece_data_loop,recedatd_sync,recedatd_numb;
recedatd_sync=GetSPIByte();
if(recedatd_sync==0x55)
{
recedatd_numb=GetSPIByte();
if(recedatd_numb>63) recedatd_numb=63;
MyRecBuff[0]=recedatd_numb;
for(rece_data_loop=1;rece_data_loop<recedatd_numb+1;rece_data_loop++)
{
MyRecBuff[rece_data_loop]=GetSPIByte();
}
commendstat=1;
}
else
{
commendstat=0;
}
}
//发送命令
void SendSPIByte(unsigned char ch)
{
unsigned char date;
SPI0DAT = ch;
Count1msInc=0;
while (SPIF == 0 && Count1msInc<1000); // 等待写结束
// while (SPIF == 0); // 等待写结束
date = SPI0DAT;
SPIF = 0;
}
void sendcommend(void)
{
unsigned int send_data_loop,senddata_numb;
SendSPIByte(0x55);
senddata_numb=MySendBuff[0];
for(send_data_loop=0;send_data_loop<senddata_numb+1;send_data_loop++)
{
SendSPIByte(MySendBuff[send_data_loop]);
}
}
void Timer0_Init (void)
{
CKCON|=0x08;
TMOD|=0x01; //16Bit Timer0
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = -SYSCLK/1000;
TR0 = 1; // START Timer0
IE|= 0x2;
}
void Timer0_ISR (void) interrupt 1 //1ms
{
TH0 = (-SYSCLK/1000) >> 8;
TL0 = -SYSCLK/1000;
Count1msInc++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -