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

📄 lib_i2c.h

📁 AT91fr40162的FLASH读写程序
💻 H
📖 第 1 页 / 共 2 页
字号:
//*----------------------------------------------------------------------------
//* File Name           : lib_i2c.h
//* Object              : I2C driver Function Prototyping File.
//*
//* 1.0 25/05/00 EL     : Creation
//* 1.1 06/09/00 EL     : Clean up
//* 2.1 15/01/02 JPP    : New functions added :
//*                         - at91_I2C_lineClose,
//*                         - at91_I2CWaitTime,
//*                         - at91_I2CTransfertEnd
//*----------------------------------------------------------------------------

#ifndef lib_i2c_h
#define lib_i2c_h
/*------------------- Include AT91 Library function -------------------------*/

//#include    "periph/pio/lib_pio.h"
//#include    "periph/timer_counter/lib_tc.h"

typedef void (TypeAICHandler) (void) ;

/*---------------------------  Constants definition -------------------------*/

//* I2C drivers internal mode
#define WRITE_BIT               0
#define READ_BIT                1
#define STOP                    2
#define DATA                    3
#define LOW_ADDRESS_WRITE       4
#define HIGH_ADDRESS_WRITE      5
#define LOW_ADDRESS_READ        6
#define HIGH_ADDRESS_READ       7
#define DEVICE_READ             8
#define DATA_READ               9



//* I2C drivers state
#define OK                      0   //* waiting new command
#define NOK                     1   //* working
/*-------------------------------------*/
/* Peripheral Identifier and Interrupt */
/*-------------------------------------*/

#define FIQ_ID          0       /* Fast Interrupt */
#define SWIRQ_ID        1       /* Soft Interrupt (generated by the AIC) */
#define US0_ID          2       /* USART Channel 0 interrupt */
#define US1_ID          3       /* USART Channel 1 interrupt */
#define TC0_ID          4       /* Timer Channel 0 interrupt */
#define TC1_ID          5       /* Timer Channel 1 interrupt */
#define TC2_ID          6       /* Timer Channel 2 interrupt */
#define WDI_ID          7       /* Watchdog interrupt */
#define PIO_ID          8       /* Parallel I/O Controller A interrupt */

#define IRQ0_ID         16      /* External interrupt 0 */
#define IRQ1_ID         17      /* External interrupt 1 */
#define IRQ2_ID         18      /* External interrupt 2 */


#define TCB0_BASE           ((StructTCBlock*)0xFFFE0000)
#define TC0_BASE            ((StructTC *)0xFFFE0000)
#define TC1_BASE            ((StructTC *)0xFFFE0040)
#define TC2_BASE            ((StructTC *)0xFFFE0080)

/*----------------*/
/* Standard types */
/*----------------*/

typedef unsigned int        _DWORD   ;
typedef unsigned short      _WORD;
typedef unsigned char       _BYTE  ;

/* 16-bit Flash Data type */
typedef volatile unsigned short flash_word ;

/* AT91 Register type */
typedef volatile unsigned int at91_reg ;

/*----------------*/
/* Boolean values */
/*----------------*/

#define TRUE                1
#define FALSE               0


/*--------------------------------------------*/
/* AIC_SMR[]: Interrupt Source Mode Registers */
/*--------------------------------------------*/

#define AIC_PRIOR                       0x07    /* Priority */

#define AIC_SRCTYPE                     0x60    /* Source Type Definition */

/* Internal Interrupts */
#define AIC_SRCTYPE_INT_LEVEL_SENSITIVE 0x00    /* Level Sensitive */
#define AIC_SRCTYPE_INT_EDGE_TRIGGERED  0x20    /* Edge Triggered */

/* External Interrupts */
#define AIC_SRCTYPE_EXT_LOW_LEVEL       0x00    /* Low Level */
#define AIC_SRCTYPE_EXT_NEGATIVE_EDGE   0x20    /* Negative Edge */
#define AIC_SRCTYPE_EXT_HIGH_LEVEL      0x40    /* High Level */
#define AIC_SRCTYPE_EXT_POSITIVE_EDGE   0x60    /* Positive Edge */

/*------------------------------------*/
/* AIC_ISR: Interrupt Status Register */
/*------------------------------------*/

#define AIC_IRQID                       0x1F    /* Current source interrupt */

/*------------------------------------------*/
/* AIC_CISR: Interrupt Core Status Register */
/*------------------------------------------*/

#define AIC_NFIQ                        0x01    /* Core FIQ Status */
#define AIC_NIRQ                        0x02    /* Core IRQ Status */

/*-------------------------------*/
/* Advanced Interrupt Controller */
/*-------------------------------*/
#define AIC_BASE                        ((StructAIC *)0xFFFFF000)

typedef struct
{
    at91_reg        AIC_SMR[32] ;       /* Source Mode Register */
    at91_reg        AIC_SVR[32] ;       /* Source Vector Register */
    at91_reg        AIC_IVR ;           /* IRQ Vector Register */
    at91_reg        AIC_FVR ;           /* FIQ Vector Register */
    at91_reg        AIC_ISR ;           /* Interrupt Status Register */
    at91_reg        AIC_IPR ;           /* Interrupt Pending Register */
    at91_reg        AIC_IMR ;           /* Interrupt Mask Register */
    at91_reg        AIC_CISR ;          /* Core Interrupt Status Register */
    at91_reg        reserved0 ;
    at91_reg        reserved1 ;
    at91_reg        AIC_IECR ;          /* Interrupt Enable Command Register */
    at91_reg        AIC_IDCR ;          /* Interrupt Disable Command Register */
    at91_reg        AIC_ICCR ;          /* Interrupt Clear Command Register */
    at91_reg        AIC_ISCR ;          /* Interrupt Set Command Register */
    at91_reg        AIC_EOICR ;         /* End of Interrupt Command Register */
    at91_reg        AIC_SPU ;           /* Spurious Vector Register */
} StructAIC;


/*---------------------------  Structure definition -------------------------*/
typedef struct
{
    at91_reg        TC_CCR ;        /* Control Register */
    at91_reg        TC_CMR ;        /* Mode Register */
    at91_reg        Reserved0 ;
    at91_reg        Reserved1 ;
    at91_reg        TC_CV ;         /* Counter value */
    at91_reg        TC_RA ;         /* Register A */
    at91_reg        TC_RB ;         /* Register B */
    at91_reg        TC_RC ;         /* Register C */
    at91_reg        TC_SR ;         /* Status Register */
    at91_reg        TC_IER ;        /* Interrupt Enable Register */
    at91_reg        TC_IDR ;        /* Interrupt Disable Register */
    at91_reg        TC_IMR ;        /* Interrupt Mask Register */
    at91_reg        Reserved2 ;
    at91_reg        Reserved3 ;
    at91_reg        Reserved4 ;
    at91_reg        Reserved5 ;
} StructTC ;

#define NB_TC_CHANNEL       3

typedef struct
{
    StructTC        TC[NB_TC_CHANNEL] ;
    at91_reg        TC_BCR ;        /* Block Control Register */
    at91_reg        TC_BMR ;        /* Block Mode Register  */
} StructTCBlock ;


//* I2C structure for driver
typedef struct I2C
{	//* Buffers
    _BYTE          	*RxPtr;             //* Recieve Buffer address
    _BYTE          	*RxEnd;				//* Recieve Buffer Pointer
    _BYTE          	*TxPtr;				//* Send Buffer address
    _BYTE          	*TxEnd;				//* Send Buffer Pointer
    
	//* Work Variables
    _BYTE          	DeviceAddress;      //* 存放设备地址的变量
    _WORD         	LoadAddress;		//* 存放FLASH地址的变量
    _BYTE       	nb_ACK;				
    _DWORD			nbI2CByte;			//* 存放写字节数的变量
    _BYTE          	mode;				//* 存放状态机工作模式额变量
    signed char     countBit;			//* 存放字节计数的变量
    _BYTE          	I2CByte;			//* 存放拟读写的字节的变量
    volatile _BYTE 	state;				//* 存放工作状态的变量
    volatile _BYTE 	cRetCode;			//* 存放操作返回码的变量,指示FLash读写操作是否成功
	_BYTE			I2CType;			//* 表示本次IC2操作的类型,是IC卡还是FLASH
	_WORD			wPageSize;			//* 定义设备每页的大小
    _DWORD         	SDA_line;			//* 指示SDA的PIO地址
    _DWORD          SCL_line;			//* 指示SCL的PIO地址
	_DWORD			dwI2CSpeed;			//* 读取IC卡的速度
	
	//* Timer Counter field
    StructTCBlock       *TCBase;        //* 指示使用的定时器
    StructTC            *timerBase;		//* 时钟使用哪个TC,TC0,TC1或TC2
    _BYTE              channelId;		//* 指示定时器在PS CLOCK中的编号,用来开启PIO的时钟
    _DWORD               timerMem;		//* 存放时钟计时的值,用来定时

	//* IRQ field
    TypeAICHandler      *AICHandler;    //* 存放定时器中断处理程序
    void (*I2CTCHandler) (struct I2C *);//* 存放当前定时器的处理程序
} I2Cdesc ;


//* Define Register coding for <reg_id>
#define RA  0
#define RB  1
#define RC  2
#define CV  3


/*--------------------------------------------------------*/
/* TC_CCR: Timer Counter Control Register Bits Definition */
/*--------------------------------------------------------*/
#define TC_CLKEN            0x1
#define TC_CLKDIS           0x2
#define TC_SWTRG            0x4

/*---------------------------------------------------------------*/
/* TC_CMR: Timer Counter Channel Mode Register Bits Definition   */
/*---------------------------------------------------------------*/

/*-----------------*/
/* Clock Selection */
/*-----------------*/
#define TC_CLKS                  0x7

⌨️ 快捷键说明

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