⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 飞思卡尔的038单片机开发板的例程。基本上这个单片的资源都被用到了。
💻 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 + -