📄 at24cxx 芯片驱动程序.txt
字号:
用【 小 | 中 | 大 】字体浏览
硬件:请教各位大峡24C02为什么写不进去 [YANGBAOSHENG] [25次] 02-1-10 上午 07:34:53
各位大峡:我用24C02做存储器,读片内数据没有问题,可就是写不进去,硬件12347脚均接
地软件用的是何立民的V2C软件包,不知是为什么盼各位大峡多多指教
我没有用过V@C,但我自己写过一个,用在系统中,一切正常,你参考一下 [EaStar1110] [24次] 02-1-10 上午 10:26:07
////////////////////////////////////////////////////////////////////////////////
///////
// AT24CXX 芯片驱动程序
// MCU : AT89C52
// XTAL : 11.0592M
// Note : 1 > 需要定义以下宏
// AT24C01 - 芯片类型 \
// AT24C02 - 芯片类型 \
// AT24C04 - 芯片类型 \
// AT24C08 - 芯片类型 > 其中必须定义且仅能一个
// AT24C16 - 芯片类型 /
// AT24C32 - 芯片类型 /
// AT24C64 - 芯片类型 /
// 2 > 需要定义以下口线
// AT24CXX_SCLK - 芯片时钟口线
// AT24CXX_IO - 芯片数据口线
// AT24CXX_WP - 芯片写保护控制口线
////////////////////////////////////////////////////////////////////////////////
///////
#ifndef __AT24CXX_H__
#define __AT24CXX_H__
////////////////////////////////////////////////////////////////////////////////
///////
#include < StyleDef.H >
////////////////////////////////////////////////////////////////////////////////
///////
// AT24CXX 芯片类型及参数宏定义
////////////////////////////////////////////////////////////////////////////////
///////
#if defined( AT24C01 )
#define AT24CXX_PAGESIZE 8
#define AT24CXX_SIZE 128
#elif defined( AT24C02 )
#define AT24CXX_PAGESIZE 8
#define AT24CXX_SIZE 256
#elif defined( AT24C04 )
#define AT24CXX_PAGESIZE 16
#define AT24CXX_SIZE 512
#elif defined( AT24C08 )
#define AT24CXX_PAGESIZE 16
#define AT24CXX_SIZE 1024
#elif defined( AT24C16 )
#define AT24CXX_PAGESIZE 16
#define AT24CXX_SIZE 2048
#elif defined( AT24C32 )
#define AT24CXX_PAGESIZE 32
#define AT24CXX_SIZE 4096
#elif defined( AT24C64 )
#define AT24CXX_PAGESIZE 32
#define AT24CXX_SIZE 8192
#else
#error Must defined macro AT24C?? , please see < At24CXX.H >.
#endif
////////////////////////////////////////////////////////////////////////////////
///////
// 函数声明
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_Init( VOID );
VOID AT24CXX_SetState( BOOL bBitLevel );
BOOL AT24CXX_Enabled( VOID );
VOID AT24CXX_SetWriteAddress( WORD wAddress );
VOID AT24CXX_SetReadAddress( WORD wAddress );
BOOL AT24CXX_Write( BYTE ucData );
VOID AT24CXX_WriteFullPage( WORD wAddress , PBYTE pBuffer );
VOID AT24CXX_WritePartPage( WORD wAddress , PBYTE pBuffer , BYTE ucSize );
VOID AT24CXX_WriteBuffer( WORD wAddress , PBYTE pBuffer , BYTE ucSize );
BYTE AT24CXX_Read( WORD wAddress );
VOID AT24CXX_ReadBuffer( WORD wAddress , PBYTE pBuffer , BYTE ucSize );
////////////////////////////////////////////////////////////////////////////////
///////
// 宏函数定义
////////////////////////////////////////////////////////////////////////////////
///////
#define AT24CXX_Start() AT24CXX_SetState( 1 )
#define AT24CXX_Stop() AT24CXX_SetState( 0 )
////////////////////////////////////////////////////////////////////////////////
///////
// 函数定义
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_Init( VOID )
{
BYTE ucVar = 0;
do {
AT24CXX_SCLK = LOW;
AT24CXX_IO = HIGH;
AT24CXX_SCLK = HIGH;
ucVar += 1;
}
while ( ( ucVar < 10 ) && ( AT24CXX_IO == LOW ) );
AT24CXX_Start();
}
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_SetState( BOOL bBitLevel )
{
AT24CXX_SCLK = LOW;
AT24CXX_IO = bBitLevel;
AT24CXX_SCLK = HIGH;
AT24CXX_IO = ~bBitLevel;
}
////////////////////////////////////////////////////////////////////////////////
///////
BOOL AT24CXX_Enabled( VOID )
{
AT24CXX_Start();
return ( ~AT24CXX_Write( 0xA0 ) );
}
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_SetWriteAddress( WORD wAddress )
{
BYTE ucCtrl = 0xA0;
#if AT24CXX_PAGESIZE < 32
ucCtrl |= ( BYTE )( ( ( wAddress ) >> 7 ) & 0x0e );
AT24CXX_Write( ucCtrl );
AT24CXX_Write( ( BYTE )( wAddress & 0xff ) );
#else
AT24CXX_Write( ucCtrl );
AT24CXX_Write( ( BYTE )( wAddress >> 8 ) );
AT24CXX_Write( ( BYTE )( wAddress & 0xff ) );
#endif
}
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_SetReadAddress( WORD wAddress )
{
BYTE ucCtrl = 0xA1;
#if AT24CXX_PAGESIZE < 32
ucCtrl |= ( BYTE )( ( ( wAddress ) >> 7 ) & 0x0e );
#endif
AT24CXX_SetWriteAddress( wAddress );
AT24CXX_Start();
AT24CXX_Write( ucCtrl );
}
////////////////////////////////////////////////////////////////////////////////
///////
BOOL AT24CXX_Write( BYTE ucData )
{
BYTE ucVar;
BIT bitAcknowledge;
for ( ucVar = 0 ; ucVar < 8 ; ucVar ++ ) {
AT24CXX_SCLK = LOW;
AT24CXX_IO = ( ( ucData & 0x80) == 0x80 );
AT24CXX_SCLK = HIGH;
ucData <<= 1;
}
AT24CXX_SCLK = LOW;
AT24CXX_IO = HIGH;
AT24CXX_SCLK = HIGH;
bitAcknowledge = AT24CXX_IO;
AT24CXX_IO = HIGH;
return ( bitAcknowledge );
}
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_WriteFullPage( WORD wAddress , PBYTE pBuffer )
{
BYTE ucVar;
while ( AT24CXX_Enabled() == FALSE );
AT24CXX_Start();
AT24CXX_SetWriteAddress( wAddress );
for ( ucVar = 0 ; ucVar < AT24CXX_PAGESIZE ; ucVar ++ )
AT24CXX_Write( pBuffer[ ucVar ] );
AT24CXX_Stop();
}
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_WritePartPage( WORD wAddress , PBYTE pBuffer , BYTE ucSize )
{
BYTE ucVar;
while ( AT24CXX_Enabled() == FALSE );
AT24CXX_Start();
AT24CXX_SetWriteAddress( wAddress );
for ( ucVar = 0 ; ucVar < ucSize ; ucVar ++ )
AT24CXX_Write( pBuffer[ ucVar ] );
AT24CXX_Stop();
}
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_WriteBuffer( WORD wAddress , PBYTE pBuffer , BYTE ucSize )
{
BYTE ucVar = 0;
AT24CXX_WP = LOW;
if ( ( wAddress % AT24CXX_PAGESIZE ) != 0 ) {
ucVar = AT24CXX_PAGESIZE - ( wAddress %
AT24CXX_PAGESIZE );
if ( ucVar > ucSize )
ucVar = ucSize;
AT24CXX_WritePartPage( wAddress , pBuffer , ucVar );
wAddress += ucVar;
pBuffer += ucVar;
ucSize -= ucVar;
}
ucVar = ucSize / AT24CXX_PAGESIZE;
while ( ucVar > 0 ) {
AT24CXX_WriteFullPage( wAddress , pBuffer );
wAddress += AT24CXX_PAGESIZE;
pBuffer += AT24CXX_PAGESIZE;
ucSize -= AT24CXX_PAGESIZE;
ucVar -= 1;
}
if ( ucSize > 0 )
AT24CXX_WritePartPage( wAddress , pBuffer , ucSize );
AT24CXX_WP = HIGH;
}
////////////////////////////////////////////////////////////////////////////////
///////
BYTE AT24CXX_Read( WORD wAddress )
{
BYTE ucData = 0;
BYTE ucVar;
BIT bitAcknowledge;
while ( AT24CXX_Enabled() == FALSE );
AT24CXX_Start();
AT24CXX_SetReadAddress( wAddress );
for ( ucVar = 0 ; ucVar < 8 ; ucVar ++ ) {
AT24CXX_SCLK = LOW;
AT24CXX_IO = HIGH;
ucData <<= 1;
AT24CXX_SCLK = HIGH;
ucData |= AT24CXX_IO;
}
AT24CXX_SCLK = LOW;
AT24CXX_IO = HIGH;
AT24CXX_SCLK = HIGH;
bitAcknowledge = AT24CXX_IO;
AT24CXX_IO = HIGH;
AT24CXX_Stop();
return ( ucData );
}
////////////////////////////////////////////////////////////////////////////////
///////
VOID AT24CXX_ReadBuffer( WORD wAddress , PBYTE pBuffer , BYTE ucSize )
{
BYTE ucVar1 , ucVar2;
BYTE ucData;
while ( AT24CXX_Enabled() == FALSE );
AT24CXX_Start();
AT24CXX_SetReadAddress( wAddress );
for ( ucVar1 = 0 ; ucVar1 < ucSize ; ) {
ucData = 0;
for ( ucVar2 = 0 ; ucVar2 < 8 ; ucVar2 ++ ) {
AT24CXX_SCLK = LOW;
AT24CXX_IO = HIGH;
ucData <<= 1;
AT24CXX_SCLK = HIGH;
ucData |= AT24CXX_IO;
}
pBuffer[ ucVar1 ] = ucData;
ucVar1++;
AT24CXX_SCLK = LOW;
AT24CXX_IO = ( ucVar1 == ucSize );
AT24CXX_SCLK = HIGH;
}
AT24CXX_SCLK = LOW;
AT24CXX_SCLK = HIGH;
AT24CXX_IO = HIGH;
AT24CXX_Stop();
}
////////////////////////////////////////////////////////////////////////////////
///////
#endif
补充的库定义 [EaStar1110] [16次] 02-1-10 上午 10:27:10
#ifndef __STYLEDEF_H__
#define __STYLEDEF_H__
////////////////////////////////////////////////////////////////////////////////
///////
////////////////////////////////////////////////////////////////////////////////
///////
// 数据类型宏定义
////////////////////////////////////////////////////////////////////////////////
///////
#ifndef BYTE
#define BYTE unsigned char
#endif
#ifndef CHAR
#define CHAR signed char
#endif
#ifndef PBYTE
#define PBYTE BYTE *
#endif
#ifndef PXBYTE
#define PXBYTE BYTE xdata *
#endif
#ifndef PCHAR
#define PCHAR CHAR *
#endif
#ifndef PXCHAR
#define PXCHAR CHAR xdata *
#endif
#ifndef WORD
#define WORD unsigned int
#endif
#ifndef INT
#define INT signed int
#endif
#ifndef VOID
#define VOID void
#endif
#ifndef PWORD
#define PWORD WORD *
#endif
#ifndef PINT
#define PINT INT *
#endif
#ifndef PVOID
#define PVOID VOID *
#endif
#ifndef DWORD
#define DWORD unsigned long
#endif
#ifndef LONG
#define LONG signed long
#endif
#ifndef PDWORD
#define PDWORD DWORD *
#endif
#ifndef PLONG
#define PLONG LONG *
#endif
#ifndef BIT
#define BIT bit
#endif
#ifndef BOOL
#define BOOL bit
#endif
#ifndef EXT_EEPROM
#define EXT_EEPROM xdata
#endif
////////////////////////////////////////////////////////////////////////////////
///////
// 数据常量宏定义
////////////////////////////////////////////////////////////////////////////////
///////
#define FALSE 0
#define TRUE 1
#define DISABLE 0
#define ENABLE 1
#define LOW 0
#define HIGH 1
#define READ 0
#define WRITE 1
#define NULL 0
#define BYTE_SIZE 1
#define WORD_SIZE 2
////////////////////////////////////////////////////////////////////////////////
///////
#endif
写24c02需要一段时间之后才去读 [wdk_tiger] [6次] 02-1-10 上午 10:30:37
谢谢大峡指点 [YANGBAOSHENG] [1次] 02-1-11 上午 07:22:45
谢谢大峡指点 [YANGBAOSHENG] [1次] 02-1-11 上午 07:24:14
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2002
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -