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

📄 at24cxx 芯片驱动程序.txt

📁 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 + -