📄 main.c
字号:
/* SPI模块例程
HCS908_QG8 单片机开发板
试验介绍:
本程序是SPI模块的例程,所用资源是单片机内部集成SPI总线模块,
所接器件为93C46
确定你开发板上拨码开关JP2(图片上的6)的7,8位和JP3(图片上
的14)的1,2位处于on(这四位是SPI和93C46的连接),而其他位处于
远离on!
试验现象:
在仿真界面的DATA1窗口中观察rebuff1,rebuff2的值是否为所写入
的数据!
author:QGL
any question mail me:
libing.qu@free-tech.com.cn
*/
/*****************头文件****************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
/*********************变量和函数定义****************************/
#define b_cs PTBD_PTBD5
unsigned char rebuff1,rebuff2,rebuff3,m;
void SPI_INI(void);
void WRITEDATA(uchar ADR,uchar DATA1,uchar DATA2) ;
void WRITEEN(void) ;
void READDATA(uchar ADR);
void delay(uchar t);
/*********************主函数************************************/
void main(void) {
SPI_INI();
WRITEEN();
delay(2);
EnableInterrupts;
m=0;
for(;m<0x03f;m++)
WRITEDATA(0x48,0x55,0x66);
for(;;) {
__RESET_WATCHDOG(); /* feeds the dog */
delay(14);
READDATA(0x88);
delay(10);
}
}
/************************SPI初始化函数*******************************/
void SPI_INI(void) {
SPIC1=0X50; //使能SPI模块为主模式,工作方式为SPI0
SPIC2=0X00;
SPIBR=0X33; //设置通讯波特率
PTBDD_PTBDD5=1; //PTB5设置为输出
}
/************************写数据函数*******************************/
void WRITEDATA(uchar ADR,uchar DATA1,uchar DATA2) {
b_cs=0;
delay(4);
b_cs=1;
delay(1);
SPID=0X01; //开始通讯
while(!SPIS_SPTEF);
SPID=ADR+m;//0;//发送写地址
while(!SPIS_SPTEF);
SPID=DATA1; //写高8位数据
while(!SPIS_SPTEF);
SPID=DATA2; //写低8位数据
while(!SPIS_SPTEF);
delay(5);
b_cs=0;
delay(2);
}
/************************读数据函数*********************************/
void READDATA(uchar ADR) {
b_cs=0;
delay(4);;
b_cs=1;
delay(1);
SPID=0X01; //开始通讯
while(!SPIS_SPTEF);
SPID=ADR; //发送读地址
while(!SPIS_SPTEF);
SPID=0X00; //发送调整脉冲
while(!SPIS_SPTEF);
SPID=0X00;
while(!SPIS_SPTEF);
rebuff1=SPID; //读高8位数据
while(!SPIS_SPRF) ;
SPID=0X00;
while(!SPIS_SPTEF);
rebuff2=SPID; //读低8位数据
while(!SPIS_SPRF) ;
SPID=0X00;
while(!SPIS_SPTEF);
rebuff3=SPID; //读低8位数据
while(!SPIS_SPRF) ;
/*以下斜线内这段代码是移位程序,SPI总线有四种工作方式,要根据SPI接口
器件的工作方式来设置.本程序的工作方式是默认的方式0,和93C46的时序有
点问题读回来的数都变成右移一位,最高位为0,所以要用下面的代码还原一下,
开发中用到此模块的朋友可以通过设置CPOL,CPHA两位不同的组合来调试*/
//////////////////////////////////////////////////////////////////
delay(1);
if(rebuff2&&0x80) {
rebuff1=((rebuff1<<1)&0xfe)+1;
}
else {
rebuff1=((rebuff1<<1)&0xfe);
}
if(rebuff3&&0x80) {
rebuff2=((rebuff2<<1)&0xfe)+1;
}
else {
rebuff2=((rebuff2<<1)&0xfe);
}
delay(5);
b_cs=0;
delay(1);
///////////////////////////////////////////////////////////////////
}
/***********************写允许函数**********************************/
void WRITEEN(void) {
b_cs=0;
delay(1);
b_cs=1;
delay(1);
SPID=0X01; //开始通讯
while(!SPIS_SPTEF);
SPID=0X30; //93c46写允许
while(!SPIS_SPTEF);
SPID=0X00;
while(!SPIS_SPTEF);
delay(1);
b_cs=0;
delay(1);
}
/***************************延时函数*******************************/
void delay(uchar t) {
unsigned char i,j;
for(i=0;i<t;i++){
for(j=0;j<10;j++)__RESET_WATCHDOG();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -