📄 lib_i2c.h
字号:
//*----------------------------------------------------------------------------
//* 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 + -