?? 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 + -