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

📄 pgm24c.c

📁 NXP LPC系列AMR7的开发程序源码(LCD
💻 C
字号:
//---------------------------------------------------------------------------
// Filename: Pgm24c.c
//---------------------------------------------------------------------------
// I2C routines for 24C256 programming
//---------------------------------------------------------------------------
// V0.1 01-12-2006 Initial release
//---------------------------------------------------------------------------
// Created for TinyARM PHIL40-03
// Tools used: IAR EWARM v4.40A
// Copyright PASAT 2004-2006
//---------------------------------------------------------------------------

#include "usercode.h"   /* Usercode macros (see <template.h>) */
#include "ma_tgt.h"     /* Target specific header file */
#include "ma_sfr.h"     /* Special function register bitfield macros */
#include "NXP/iolpc210x.h"  /* Defines Special function registers */

//#include "ma_uart0.h"    /* UART0 Module driver header file */
#include "ma_uart1.h"    /* UART1 Module driver header file */
#include "ma_gpio.h"     /* GPIO  Module driver header file */
#include "ma_spi.h"      /* SPI   Module driver header file */
#include "ma_i2c.h"      /* I2C   Module driver header file */
#include "ma_pcb.h"     /* PCB Module driver header file */

#include "string.h"
#include "stdio.h"
#include "easypgm.h"
#include "Pgm24c.h"

extern unsigned char RamBuffer[];
extern unsigned short CurrentPageSize;
extern char Info;
extern char StatusI2C;

//Extern functions
extern void Send_Some_Uart(U8 Data8, U8 Count8);
extern S8 MA_WritePoll_I2C(void);
extern S8 I2C_StartRead_24C256( U8 *pTxData );
extern S8 I2C_PageRead_24C256( U8 *pRxData, U16 Length );

//----------------------------------------------
// Copy 24C256 EEPROM to RAM buffer (Load EEPROM)
//----------------------------------------------
short Exec_Copy24C256_RAM_Old(void)
{
	char Result;

	RamBuffer[0] = I2C_SLAVEADR_RCV;
	// Note: Is it necessary to set initial address ?
	Result = MA_MasterRead_I2C(RamBuffer,Size_24C256);

	if (Result==MA_OK) return 0;
	else  return 1;
}

short Exec_Copy24C256_RAM(void)
{
	char Result;
    unsigned short i,PageStart;
	unsigned char *Ptr=&RamBuffer[1];
	unsigned char LocalBuffer[4+64];
	char AdrBuffer[10];
	char *AdrPtr;

	MA_PutChar_UART1(0xD);
	MA_PutChar_UART1(0xA);

	AdrPtr=&AdrBuffer[0];

	for (i=0; i<Size_24C256/CurrentPageSize; i++)
	{
		PageStart=i*CurrentPageSize;
		if ((PageStart & 0xFF)==0)
		{
			MA_PutString_UART1(" Adr=");
			sprintf(AdrPtr,"%04hX",PageStart);
			MA_PutString_UART1(AdrPtr);
	    	Send_Some_Uart(KEY_LEFT,9);
		}
		LocalBuffer[0] = I2C_SLAVEADR_SEND;
		LocalBuffer[1] = (unsigned char)(PageStart>>8);
		LocalBuffer[2] = (unsigned char)(PageStart&0xFF);
		LocalBuffer[3] = I2C_SLAVEADR_RCV;

		Result = I2C_PageRead_24C256(LocalBuffer,CurrentPageSize+4);
		if (Result!=MA_OK) break;
		memcpy(Ptr,&LocalBuffer[4],CurrentPageSize);
		Ptr+=CurrentPageSize;
    }
	MA_PutChar_UART1(0xD);
	MA_PutChar_UART1(0xA);

	if (Result==MA_OK) return 0;

	// Error
	MA_PutString_UART1(" Read Error");
/*
	if (!Info)   MA_PutChar_UART1('0');
	if (Info==1) MA_PutChar_UART1('1');
	if (Info==2) MA_PutChar_UART1('2');
	if (Info==3) MA_PutChar_UART1('3');
	if (Info==4) MA_PutChar_UART1('4');
	if (Info==5) MA_PutChar_UART1('5');
	if (Info==6) MA_PutChar_UART1('6');
	if (Info==7) MA_PutChar_UART1('7');
	MA_PutString_UART1(" Status=");
	sprintf(AdrPtr,"%04hX",StatusI2C);
	MA_PutString_UART1(AdrPtr);
*/
	MA_PutChar_UART1(0xD);
	MA_PutChar_UART1(0xA);

	return 1;
}

//----------------------------------------------
// Copy RAM buffer to 24C256 EEPROM (Burn EEPROM)
//----------------------------------------------
// Use a buffer: Buffer[0]=SLA+W,Buffer[1]=MSB Adr,
// Buffer[2]=LSB Adr, Buffer[3..66]=EEPROM page data
//----------------------------------------------
short Exec_CopyRAM_24C256(void)
{
    unsigned short i,PageStart;
	char Result,Error;
	unsigned char *Ptr=&RamBuffer[1];
	unsigned char LocalBuffer[3+64];
	char AdrBuffer[10];
	char *AdrPtr;

	MA_PutChar_UART1(0xD);
	MA_PutChar_UART1(0xA);

	AdrPtr=&AdrBuffer[0];
	Error=0;

	for (i=0; i<Size_24C256/CurrentPageSize; i++)
	{
		PageStart=i*CurrentPageSize;
		if ((PageStart & 0xFF)==0)
		{
			MA_PutString_UART1(" Adr=");
			sprintf(AdrPtr,"%04hX",PageStart);
			MA_PutString_UART1(AdrPtr);
	    	Send_Some_Uart(KEY_LEFT,9);
		}
		LocalBuffer[0] = I2C_SLAVEADR_SEND;
		LocalBuffer[1] = (unsigned char)((i*CurrentPageSize)>>8);
		LocalBuffer[2] = (unsigned char)((i*CurrentPageSize)&0xFF);
		memcpy(&LocalBuffer[3],Ptr,CurrentPageSize);
		Result = MA_MasterWrite_I2C(LocalBuffer,CurrentPageSize+3);
	    if (Result!=MA_OK) {Error=1;break;}
		Result = MA_WritePoll_I2C();
	    if (Result!=MA_OK) {Error=2;break;}
		Ptr+=CurrentPageSize;
	}

	MA_PutChar_UART1(0xD);
	MA_PutChar_UART1(0xA);
	if (!Error) return Result;

	if (Error==1)
	{
		MA_PutString_UART1(" Burn Error");
		if (!Info) MA_PutChar_UART1('0');
		if (Info==1) MA_PutChar_UART1('1');
		if (Info==2) MA_PutChar_UART1('2');
		if (Info==3) MA_PutChar_UART1('3');
		if (Info==4) MA_PutChar_UART1('4');

		MA_PutString_UART1(" Status=");
		sprintf(AdrPtr,"%04hX",StatusI2C);
		MA_PutString_UART1(AdrPtr);

		MA_PutString_UART1(" Adr=");
		sprintf(AdrPtr,"%04hX",PageStart);
		MA_PutString_UART1(AdrPtr);
		
	}
	else          MA_PutString_UART1(" Poll Error");
	MA_PutChar_UART1(0xD);
	MA_PutChar_UART1(0xA);
	return Result;
}

⌨️ 快捷键说明

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