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

📄 srom_fun.c

📁 X25650相关程序,可实现对X25650的读写,页读写功能,附一些子函数
💻 C
📖 第 1 页 / 共 2 页
字号:
// 读写X25650函数
#include <c8051f020.h>
#include <defjk206.h>

sbit  SPINSS           =  P1^5 ;

uchar xdata PAGE_BUFF [ 32 ] ;        // X25650 工作单元

uchar spirsts ( void ) ;
uchar rdbytespi ( uint address ) ;
void rdpgespi ( uint address ) ;
void wrbytespi ( uint address , uchar dat ) ;
void write_add_para ( void ) ;
void write_ctrl_data ( void ) ;
void write_oup ( void ) ;
void write_odp ( void ) ;
void write_iup ( void ) ;
void write_idp ( void ) ;
void write_qa_tel ( void ) ;
void write_self_tel ( void ) ;
void write_power_limit ( void ) ;     // 上、下行输出功率上限
void write_number ( void ) ;
void write_alarm_ena ( void ) ;
void write_op_switch ( void ) ;
void write_atten ( void ) ;
//void write_channel ( void ) ;
//void write_schannel ( void ) ;

extern uint  xdata us_chan_no[8] , ds_chan_no[8] ;  //	上、下行移频信道号
extern uint  xdata chan_no[16] ;                    //	工作信道号,上、下行使用一个值
extern uchar xdata STATION_NO1       ;              // 直放站编号 4 BYTES
extern uchar xdata STATION_NO2       ;
extern uchar xdata STATION_NO3       ;
extern uchar xdata STATION_NO4       ;
extern uchar xdata EQUIPMENT_NO      ;              // 设备编号 1 BYTE
extern uint xdata ALARM_DELAY_TIME ;
extern uint xdata ALARM_SPACE_TIME ;
extern uchar data freq140x70         ;
extern uchar xdata EQUIPMENT_TYPE    ;              // 设备类型 1 BYTE
extern uchar xdata COM_MODE          ;              // 直放站通讯方式
extern uchar xdata max_u_gain , max_d_gain ;        // 上、下最大增益
extern uint xdata oup_table [ 37 ] ;
extern uint xdata odp_table [ 37 ] ;
extern uint xdata iup_table [ 36 ] ;
extern uint xdata idp_table [ 36 ] ;
extern uchar xdata query_tel [ 15 ] ;
extern uchar xdata alarm_tel [ 15 ] ;
extern uchar xdata self_tel [ 15 ] ;
extern uchar xdata up_power_limit , down_power_limit , d_in_pow_limit ;
extern uchar xdata up_amp_sw [2], down_amp_sw [2] ;   // 上、下行功放开关
extern uchar xdata u_atten[16], d_atten[16] ;         // 上、下衰减值

extern BIT_STRUCT xdata alarm_ena [7] ;

 /////////////////////////////////////////////////////////////////////
//函 数 名:spiwcmd  ()
//功能描述: 读SPI_WREN(0x06)写允许函数
//函数说明:
//调用函数:
//全局变量:
//返 回 值:
//版    本:
/////////////////////////////////////////////////////////////////////
void spiwcmd ( uchar x_adress )
 {
   //uchar xi ;
   SPIEN = 1 ;                     //允许SPI总线
   SPINSS = 0 ;                    // nss = 0
   //for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPIF = 0;                       //关闭spi中断(去除spi中断标志),spif为spi中断标志,只能软件清除中断标志
   SPI0DAT = x_adress ;
   while(SPIF == 0) _nop_ ( ) ;    //等待一个字节传送完
   //for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPINSS = 1 ;
   SPIEN = 0 ;
 }
  /////////////////////////////////////////////////////////////////////
//函 数 名:spiwsts ()
//功能描述: 写0X00到SPIODAT寄存器函数
//函数说明:
//调用函数:
//全局变量:
//版    本:
/////////////////////////////////////////////////////////////////////
void spiwsts ( void )
 {
   uchar xi ;
   SPIEN = 1 ;                     
   SPINSS = 0 ;                  
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPIF = 0 ;
   SPI0DAT = SPI_WRSR ;
   while(SPIF == 0) _nop_ ( ) ;   
   SPIF = 0 ;
   SPI0DAT = 0x00 ;
   while(SPIF == 0) _nop_ ( ) ;  
   SPIF = 0 ;
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPINSS = 1 ;
   SPIEN = 0 ;
 }
  /////////////////////////////////////////////////////////////////////
//函 数 名:spirsts ()
//功能描述: 读允许后.读出一字节数据传给Xi
//函数说明:
//调用函数:
//全局变量:
//设 计 者:
//修 改 者:
//版    本:
/////////////////////////////////////////////////////////////////////
uchar spirsts ( void ) 
 {
   uchar xi ;
   SPIEN = 1 ;
   SPINSS = 0 ;                  
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPIF = 0;
   SPI0DAT = SPI_RDSR ;
   while(SPIF == 0) _nop_ ( ) ;    
   SPIF = 0 ;
   SPI0DAT = 0x00 ;
   while(SPIF == 0) _nop_ ( ) ;    
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   xi = SPI0DAT ;
   SPINSS = 1 ;
   SPIEN = 0 ;
   SPIF = 0 ;
   return xi ;
 }
  /////////////////////////////////////////////////////////////////////
//函 数 名:wrbytespi ()
//功能描述: 将一字节数据写入到address(十六位地址)中的函数
//函数说明:
//调用函数:
//全局变量:
//设 计 者:
//修 改 者:
//版    本:
/////////////////////////////////////////////////////////////////////
void wrbytespi ( uint address , uchar dat ) 
 {
   uchar xi ;
   spiwcmd ( SPI_WREN ) ;
   SPIEN = 1 ;                     // 允许SPI总线
   SPINSS = 0 ;                    // nss = 0
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPIF = 0;
   SPI0DAT = SPI_WRITE ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   SPIF = 0;
   SPI0DAT = (address / 0x100) ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   SPIF = 0;
   SPI0DAT = (address % 0x100) ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   SPIF = 0;
   SPI0DAT = dat ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPINSS = 1 ;
   SPIEN = 0 ;
   SPIF = 0 ;
 }
   /////////////////////////////////////////////////////////////////////
//函 数 名:rdbytespi ()
//功能描述: 将16位地址(address)中的高、低字节中的1byte数据读出到SPIODAT.
//函数说明:
//调用函数:
//全局变量:
//设 计 者:
//修 改 者:
//版    本:
/////////////////////////////////////////////////////////////////////
uchar rdbytespi ( uint address )
 {
   uchar xi ;
   SPIEN = 1 ;                     // 允许SPI总线
   SPINSS = 0 ;                    // nss = 0
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPIF = 0;
   SPI0DAT = SPI_READ ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   SPIF = 0;
   SPI0DAT = (address / 0x100) ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   SPIF = 0;
   SPI0DAT = (address % 0x100) ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   SPIF = 0;
   SPI0DAT = 0x00 ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPINSS = 1 ;
   SPIEN = 0 ;
   SPIF = 0 ;
   return SPI0DAT ;
 }
    /////////////////////////////////////////////////////////////////////
//函 数 名:wrpgespi ()
//功能描述: 一次将32组数据写入address开始的十六位地址中
//函数说明:
//调用函数:
//全局变量:
//设 计 者:
//修 改 者:
//版    本:
/////////////////////////////////////////////////////////////////////
void wrpgespi ( uint address )
 {
   uchar xi ;
   spiwcmd ( SPI_WREN ) ;
   SPIEN = 1 ;                     // 允许SPI总线
   SPINSS = 0 ;                    // nss = 0
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPIF = 0 ;
   SPI0DAT = SPI_WRITE ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   SPIF = 0;
   SPI0DAT = (address / 0x100) ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   SPIF = 0 ;
   SPI0DAT = (address % 0x100) ;
   while(SPIF == 0) _nop_ ( ) ;    // 等待一个字节传送完
   for ( xi = 0x00 ; xi < 32 ; xi ++ )
    {
	    SPIF = 0;
     SPI0DAT = PAGE_BUFF [ xi ] ;
     while(SPIF == 0) _nop_ ( ) ;  // 等待一个字节传送完
    }																						 
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
   SPIF = 0 ;
   SPINSS = 1 ;
   SPIEN = 0 ;
   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
 }
 /////////////////////////////////////////////////////////////////////
//函 数 名:rdpgespi ()
//功能描述:从X25650中读出32字节
//函数说明:
//调用函数:
//全局变量:
//设 计 者:
//修 改 者:
//版    本:
/////////////////////////////////////////////////////////////////////
void rdpgespi ( uint address )
 {
    uchar xi ;
    SPIEN = 1 ;						//SPI总线允许
    SPINSS = 0 ;                   // nss = 0
    for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
    SPIF = 0 ;
    SPI0DAT = SPI_READ ;
    while(SPIF == 0) _nop_ ( ) ;   // 等待一个字节传送完
    SPIF = 0 ;
    SPI0DAT = (address / 0x100) ;
    while(SPIF == 0) _nop_ ( ) ;   // 等待一个字节传送完
    SPIF = 0 ;
    SPI0DAT = (address % 0x100) ;
    while(SPIF == 0) _nop_ ( ) ;   // 等待一个字节传送完
   	for ( xi = 0x00 ; xi < 32 ; xi ++ )
	    {
	     SPIF = 0 ;
      SPI0DAT = 0x00 ;
      while(SPIF == 0) _nop_ ( ) ;  // 等待一个字节传送完
      PAGE_BUFF  [ xi ] = SPI0DAT ;
	  //while(SPIF == 0) _nop_ ( ) ;  // 等待一个字节传送完
     }
	   for ( xi = 0x00 ; xi < 200 ; xi ++ ) _nop_ ( ) ;
    SPINSS = 1 ;
    SPIEN = 0 ;
    SPIF = 0 ;
 } 
 /////////////////////////////////////////////////////////////////////
//函 数 名:write_add_para ()
//功能描述:
//函数说明:
//调用函数:
//全局变量:
//设 计 者:
//修 改 者:
//版    本:
/////////////////////////////////////////////////////////////////////
void write_add_para ( void )
 {
   uchar ii ;
   for ( ii = 0 ; ii < 32 ; ii ++ ) PAGE_BUFF [ ii ] = 0xff ;
   PAGE_BUFF [ 0x00 ] = ALARM_SPACE_TIME % 0x100 ;
   PAGE_BUFF [ 0x01 ] = ALARM_SPACE_TIME / 0x100 ;
   PAGE_BUFF [ 0x02 ] = ALARM_DELAY_TIME % 0x100 ;
   PAGE_BUFF [ 0x03 ] = ALARM_DELAY_TIME / 0x100 ; 
   PAGE_BUFF [ 0x04 ] = freq140x70 ;
   PAGE_BUFF [ 0x05 ] = EQUIPMENT_TYPE ;
   wrpgespi ( add_of_add_para ) ;
   ii = spirsts ( ) ;                 // 延时约5-10MS
   while ( ii & 0x01 ) ii = spirsts () ;
 }
  /////////////////////////////////////////////////////////////////////
//函 数 名:write_ctrl_data ()
//功能描述:写入上行与下行最大增益
//函数说明:
//调用函数:
//全局变量:
//设 计 者:
//修 改 者:
//版    本:
/////////////////////////////////////////////////////////////////////
void write_ctrl_data ( void )
 {
   uchar ii ;
   PAGE_BUFF [ 0x00 ] = max_u_gain ; // 最大增益
   PAGE_BUFF [ 0x01 ] = max_d_gain ; // 最大增益
   wrpgespi ( add_of_ctrl_dat_table ) ;
   ii = spirsts ( ) ;                 // 延时约5-10MS
   while ( ii & 0x01 )	ii = spirsts () ;
 }
  /////////////////////////////////////////////////////////////////////
//函 数 名:write_oup ()
//功能描述:上行输出功率配置表写入25650
//函数说明:
//调用函数:
//全局变量:
//设 计 者:
//修 改 者:
//版    本:
/////////////////////////////////////////////////////////////////////
void write_oup ( void )
 {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -