📄 c8051f320spi_io.c
字号:
/////////////////////////////////////
// Generated Initialization File //
/////////////////////////////////////
#include "c8051f320.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//////////////////////////
//#define set_sck (P0 |=1<<0)
//#define clr_sck (P0 &=~(1<<0))
sbit p0_0=P0^0;
sbit p0_4=P0^4;
sbit p0_1=P0^1;
/*
#define set_csn (p1 |=1<<0)
#define set_sck (p1 |=1<<1)
#define set_mosi (p1 |=1<<2)
#define set_miso (p1 |=1<<3)
#define clr_csn (p1 &=~(1<<0))
#define clr_sck (p1 &=~(1<<1))
#define clr_mosi (p1 &=~(1<<2))
#define clr_miso (p1 &=~(1<<3))
*/
//////////////////////////
sbit CSW=P0^6; //P0^6 select slave SPI for WRITE
//NSSMD0 select slave SPI for READ
sbit LED=P1^6;
char k;
int temp_result[4];
// Peripheral specific initialization functions,
// Called from the Init_Device() function
/*void Reset_Sources_Init()
{
int i = 0;
VDM0CN = 0x80;
for (i = 0; i < 350; i++); // Wait 100us for initialization
RSTSRC = 0x04;
}*/
/*
void PCA_Init()
{
PCA0MD &= ~0x40;
PCA0MD = 0x00;
}
*/
void pca_init(void)
{
PCA0MD=0x89; //PCA采用系统时钟,且PCA溢出中断开启
PCA0CN=0x40; //启动PCA计数器
EIE1|=0x10; //PCA中断使能
PCA0CPM0=0x46; //频率输出模式
}
void cex0_fre_set(unsigned char time) //频率输出为:PCA时钟频率/(2*time)
{
PCA0CPH0=time;
}
void SPI_Init()
{
SPI0CFG = 0x18;//18;//0x40;//0x00;//0x40; //master mode
SPI0CN = 05;//0x0D; //CS OFF,enable SPI
SPI0CKR = 0xFF; //95730Hz
}
void Port_IO_Init()
{
// P0.0 - SCK (SPI0), Open-Drain, Digital
// P0.1 - MISO (SPI0), Open-Drain, Digital
// P0.4 - MOSI (SPI0), Open-Drain, Digital
// P0.5 - NSS (SPI0), Push-Pull, Digital
// P0.4 - Unassigned, Open-Drain, Digital
// P0.5 - Unassigned, Open-Drain, Digital
// P0.6 - Unassigned, Push-Pull, Digital
// P0.7 - Unassigned, Open-Drain, Digital
// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Push-Pull, Digital
// P1.7 - Unassigned, Open-Drain, Digital
/* P0MDOUT = 0x49;//0x20;
P1MDIN = 0xFF;
P1MDOUT = 0xFF;
// P0SKIP = 0x0C;
XBR0 = 0x02;//允许SPI
XBR1 = 0x40;
*/
// XBR0=0x02; //不允许SMBus、UART,允许SPI
XBR0=0x00;
XBR1=0x41; //允许交叉开关和弱上拉,CEX0连接到端口引脚
// P0MDOUT = 0xC3;//0xC2;
P0MDOUT = 0x00;
// P0MDIN=0x11;
P0SKIP=0x7F;//0x4C;//0x7F; //配置交叉开关跳过P0.2 P0.3(晶振) P0.0 P0.1(运放)
//将P0.7作为时钟输出
P1MDIN=0xFF;
P1MDOUT=0xFF;
P2MDIN=0xFE; //将P2.0配置为模拟输入
P2SKIP=0x01; //交叉开关跳过P2.0
}
void sysclk_init(void)
{
// unsigned char n;
PCA0MD=0x89; //禁止看门狗定时器,PCA采用系统时钟,允许中断
/*
OSCXCN=0x67; //启动外部振荡器
for(;n<255;n++);
while((OSCXCN & XTLVLD_BIT)==0) //等待外部振荡器起动
{}
CLKSEL=0x01; //选择外部振荡器作为系统时钟,可在此设置USB时钟源 CLKSEL=0x01; //选择外部振荡器作为系统时钟,可在此设置USB时钟
OSCICN=0x00; //禁止内部振荡器
*/
//使用内部振荡器
//CLKSEL = 0x70; //USB时钟保留
OSCXCN = 0x00;
OSCICN = 0x83; //内部振荡器不分频 内部12MHz
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
sysclk_init();
// PCA_Init();
// Reset_Sources_Init();
// SPI_Init();
Port_IO_Init();
pca_init();
cex0_fre_set(5);
}
/*
void delay(uint t)
{
uint k;
for(k=0;k!=t;k++);
// NOP();
}
*/
void delay(unsigned int time) //
{
while(time--)
{}
}
void delay_ms(unsigned int i)
{while(i--)
delay(1000);
}
void SEND8(uchar data8) //send 8 bits data
{
delay(20); //waiting > 2us
SPIF=0;
SPI0DAT=data8;
SPIF=1;
while(SPIF==0);
delay(20);
}
void WEN8(void) //write enable
{
SEND8(0x02);
SEND8(0x60);
}
void WDS8(void) //write disable
{
SEND8(0x02);
SEND8(0x00);
}
/*
void WRITE8(uchar addr8,uchar data8) //write data
{
uchar k=0;
k=0x80 | addr8;
SEND8(0x02);
SEND8(k);
SEND8(data8);
}
*/
uchar READ8(uchar addr8) //read data
{
//uchar k[5]=0;
uchar result[5]=0;
uchar k=0;
uchar i;
delay(40);
//SEND8(0x03);
SEND8(addr8);
//SEND8(0x01);
//for (i=0;i<=4;i++)
// {k[i]=SPI0DAT;}
for(i=0;i<=4;i++)
{result[i]=SPI0DAT;}
k=SPI0DAT;
//RXOVRN=0;
return(k);
}
void WRALL8(uchar data8) //write all
{
SEND8(0x02);
SEND8(0x20);
SEND8(data8);
}
void CSWON(void) //CS ON
{
CSW=1;
delay(20);
}
void CSWOFF(void) //CS OFF
{
CSW=0;
delay(20);
}
void CSRON(void) //CS ON
{
NSSMD0=1;
delay(20);
}
void CSROFF(void) //CS OFF
{
NSSMD0=0;
delay(20);
}
/*
void ERAL8(void) //Erase all
{
SEND8(0x02);
SEND8(0x40);
}
*/
/*
void main(void)
{
unsigned int i;
uchar str;
// static uchar result=0;
static ulong result=0;
// bit aa;
Init_Device();
p0_1=1;
p0_0=1;
delay_ms(1000);
p0_1=0;
for(i=0;i<8;i++)
{
// clr_sck;
p0_0=0;
delay(260);
str=p0_4;
//
// delay_ms(1);
// set_sck;
p0_0=1;
delay(260);
// delay_ms(1);
result = result+ (str<<(7-i));
// str=str<<1;
}
// p0_1=1;
// delay_ms(500);
// while(1);
}
*/
void main(void)
{
uchar i;
uchar str;
// unsigned char str1;
// static uchar result=0;
// static uchar result=0;
unsigned char MSB=0;
static uchar LSB=0;
static uchar SUM=0;
static uchar CR=0;
static uchar ITEM=0;
bit stop;
Init_Device();
//for(i=0;i<8;i++)
stop=0;
p0_1=0;
p0_0=1;
delay_ms(1000);
p0_1=0;
while(!stop)
{
for(i=0;i<=7;i++)
{
//p0_0=1;
if(p0_0==0)
//delay(260);
str=p0_4;
//p0_0=0;
if(p0_0==1)
//delay(260);
ITEM = ITEM + (str<<(7-i));
}
// MSB=result>>24;
if(ITEM==0x4C)
{
//ITEM=result;
//
for(i=0;i<=7;i++)
{
//p0_0=1;
if(p0_0==0)
//delay(300);
str=p0_4;
//p0_0=0;
if(p0_0==1)
//delay(300);
MSB = MSB + (str<<(7-i));
}
//
for(i=0;i<=7;i++)
{
//p0_0=1;
if(p0_0==0)
//delay(260);
str=p0_4;
//p0_0=0;
if(p0_0==1)
//delay(260);
LSB = LSB + (str<<(7-i));
}
for(i=0;i<=7;i++)
{
//p0_0=1;
if(p0_0==0)
//delay(260);
str=p0_4;
//p0_0=0;
if(p0_0==1)
//delay(260);
SUM = SUM + (str<<(7-i));
}
for(i=0;i<=7;i++)
{
//p0_0=1;
if(p0_0==0)
//delay(260);
str=p0_4;
//p0_0=0;
if(p0_0==1)
//delay(260);
CR = CR + (str<<(7-i));
}
//
}
if(ITEM==0x4C && CR==0x0D && ((ITEM+MSB+LSB)&0xff)==(SUM&0xff))
stop=0;
}
}
//
/* for(i=0;i<=7;i++)
{
p0_0=1;
delay(260);
str=p0_4;
p0_0=0;
delay(260);
MSB = MSB + (str<<(7-i));
}
//
//
for(i=0;i<=7;i++)
{
p0_0=1;
delay(260);
str=p0_4;
p0_0=0;
delay(260);
LSB = LSB + (str<<(7-i));
}
//*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -