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

📄 drvprom.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
#include "includes.h"
#include "fi2c.h"
#include "funcprom.h"
#include "hardware.h"
#include "device.h"
//#include "funcint.h"
#include "feeprom.h"
#define ROM_SIZE 		0x2000	//8K bytes
#define ROM_NUM			2		//two chips of EEPROM in the system
#define ROM_PAGE_SIZE 	32
#define CONTROL0	0b10100000	//control byte when write or read EEPROM0
#define CONTROL1	0b10100010	//control byte when write or read EEPROM1

INT8U eeprom_write( INT8U rom *wrptr, INT16U length );
INT16U eeprom_read( INT8U rom *rdptr, INT16U length );
INT8U eeprom_ioctl(INT8U cmd, INT24U arg);
INT8U eeprom_init(void);
INT8U eeprom_open(void);

void rminit(void);

#pragma romdata CCODE
DEV_HEADER DEV_SEEPROM = {
	DEV_ID_SEEPROM,			/*device ID  */
	{'r','o','m'},			/*device name*/
	DEVP_CHAR,				/*device Type*/
	eeprom_init,			/*device init function*/
	FNull_1,				/*device clear function*/
	eeprom_open,			/*device open function*/
	FNull_1,				/*device close function*/
	eeprom_ioctl,			/*device ioctl function*/
	eeprom_write,			/*device write function*/
	eeprom_read				/*device read function*/
};

INT8U  control;
WORD_VAL address;
#pragma romdata EXTRAM
INT8U rom hdl_i2c;
INT8U  rom Prom_buf[10];
INT8U rom RomDataRam[ROM_SIZE*ROM_NUM];	//This ram block is used to buffer rom data, can be alloced dynamically
#pragma code MYCODE
INT8U eeprom_init(void){
	hdl_i2c = sysdev_open(DEV_ID_I2C);
	rminit();
	if(hdl_i2c == 0xff) return(1);
}

INT8U eeprom_open(void){
	//currently do nothing
}


INT8U eeprom_ioctl(INT8U cmd, INT24U arg){
	if(cmd == EEPROM_ADDRESS){
		address.Val = (INT16U)arg;
	}
}

//Page write to EEPROM from external RAM
INT8U eeprom_write(INT8U rom *wrptr, INT16U length ){
	INT8U i;
	for(;;){
		if(address.Val < ROM_SIZE)	control = CONTROL0;
		else control = CONTROL1;

		i = ROM_PAGE_SIZE - (LSB(address) & (ROM_PAGE_SIZE-1));
		if(i > length) i = length;
		
		sysdev_ioctl(hdl_i2c, I2C_IDLE,0);
		sysdev_ioctl(hdl_i2c, I2C_START,0);
		if(sysdev_ioctl(hdl_i2c, I2C_BUSSTT,0)!=0){
			sysdev_ioctl(hdl_i2c, I2C_STOP,0);
    		return ( 1 );                // return with Bus Collision error 
		}	  	
  		else{                            // start condition successful
	  		Prom_buf[0] = control;
		  	Prom_buf[1] = MSB(address);//addressh;
	 	 	Prom_buf[2] = LSB(address);//addressl;
	  	
		  	if(sysdev_write(hdl_i2c, Prom_buf, 3) != 0) return(0);
	 	 	sysdev_write(hdl_i2c, wrptr, i);
		}
		sysdev_ioctl(hdl_i2c, I2C_IDLE,0);
		sysdev_ioctl(hdl_i2c, I2C_STOP,0);
		if(sysdev_ioctl(hdl_i2c, I2C_BUSSTT,0) != 0){
			sysdev_ioctl(hdl_i2c, I2C_STOP,0);
			return(1);
		}
		OSTimeDly(2);
		wrptr += i;
		length -= i;
		address.Val +=i;
		if(length == 0) return(0);
	}
}		

//Random read to external RAM
INT16U eeprom_read(INT8U rom *rdptr,INT16U length ){
	INT16U romlen[2];
	INT8U i;

	if(address.Val >=ROM_SIZE){
		romlen[0] = 0;
		romlen[1] = length;
	}
	else if(length > ROM_SIZE - address.Val){                                           //located in EEPROM 0 and 1
		romlen[0] = ROM_SIZE - address.Val;
		romlen[1] = length - romlen[0];
	}
	else{                                                                          //located only in EEPROM 0
		romlen[0] = length;
		romlen[1] = 0;
	}

	for(i=0;i<2; i++){
		if(romlen[i] != 0){
			if(i == 0) control = CONTROL0;
			else control = CONTROL1;
			sysdev_ioctl(hdl_i2c, I2C_IDLE,0);
			sysdev_ioctl(hdl_i2c, I2C_START,0);
			if(sysdev_ioctl(hdl_i2c, I2C_BUSSTT,0)!=0){
				sysdev_ioctl(hdl_i2c, I2C_STOP,0);
		    	return ( 0 );              
			}	  	
		  	else{
	  			Prom_buf[0] = control;
			  	Prom_buf[1] = MSB(address);
	  			Prom_buf[2] = LSB(address);

				if(sysdev_write(hdl_i2c, Prom_buf, 3) != 0) return(0);	  	
				sysdev_ioctl(hdl_i2c, I2C_RESTART,0);
				Prom_buf[0] |= 0x01;
				if(sysdev_write(hdl_i2c, Prom_buf,1) != 0) return(0);
				sysdev_read(hdl_i2c, rdptr,romlen[i]);
				sysdev_ioctl(hdl_i2c, I2C_NOTACK,0);
				sysdev_ioctl(hdl_i2c,I2C_STOP,0);
				if(sysdev_ioctl(hdl_i2c, I2C_BUSSTT, 0) != 0) return(0);
			}
			rdptr += romlen[i];
			address.Val += romlen[i];
		}
	}
	return(length);
}


//-------------------------------------------------------------//
//         "RomDataRam" block management functions             //
//-------------------------------------------------------------//
INT8U rom * rm;
INT16U	rm_len;
#pragma code MYCODE
void rminit(void){
	rm = RomDataRam;
	rm_len = sizeof(RomDataRam);
}

INT8U rom * rmalloc(INT16U len){
	INT8U rom * pt;
	if(len <= rm_len){
		rm_len -= len;
		pt = rm;
		rm += len;
	}
	else pt = NULL_PTR;
	return(pt);
}

⌨️ 快捷键说明

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