文件(iic.h):
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X80000000;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X30000000;}
#define IIC_SCL PBout(6)
#define IIC_SDA PBout(7)
#define READ_SDA PBin(7)
void bsp_iic_init(void);
void bsp_iic_start(void);
void bsp_iic_stop(void);
void bsp_iic_sendByte(u8 txd);
u8 bsp_iic_readByte(unsigned char ack);
u8 bsp_iic_waitAck(void);
void bsp_iic_ack(void);
void bsp_iic_nAck(void);
文件(iic.c):
/*
****************************************************************
** brief : IIC 初始化,IO模擬IIC
** note : SDA-PB7,SCL-PB6
****************************************************************
*/
void bsp_iic_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);
}
/*
***************************************************************
** brief : IIC開(kāi)始信號(hào)
** note : SCL為高電平時(shí),SDA由高電平向低電平跳變
***************************************************************
*/
void bsp_iic_Start(void)
{
delay_5us();
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
delay_5us();
IIC_SDA=0;
delay_5us();
IIC_SCL=0;
}
/*
***************************************************************
** brief : IIC停止信號(hào)
** note : SCL為高電平時(shí),SDA由低電平向高電平跳變
***************************************************************
*/
void bsp_iic_stop(void)
{
delay_5us();
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_5us();
IIC_SCL=1;
delay_5us();
IIC_SDA=1;
delay_5us();
}
/*
**********************************************************
** brief : 等待應(yīng)答信號(hào)到來(lái)
** ret : 1.接收應(yīng)答失敗
** 0.接收應(yīng)答成功
*********************************************************
*/
u8 bsp_iic_waitAck(void)
{
u8 ucErrTime=0;
delay_5us();
SDA_IN();
IIC_SDA=1;
delay_5us();
IIC_SCL=1;
delay_5us();
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>100)
{
bsp_iic_stop();
return 1;
}
}
delay_5us();
IIC_SCL=0;
return 0;
}
/* brief : 產(chǎn)生應(yīng)答信號(hào)*/
void bsp_iic_ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_5us();
IIC_SCL=1;
delay_5us();
IIC_SCL=0;
}
/* brief : 產(chǎn)生非應(yīng)答信號(hào)*/
void bsp_iic_nAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_5us();
IIC_SCL=1;
delay_5us();
IIC_SCL=0;
}
/*
*************************************************
** breif : IIC發(fā)送一個(gè)字節(jié)
*************************************************
*/
void bsp_iic_sendByte( u8 txd )
{
u8 t;
delay_5us();
SDA_OUT();
IIC_SCL=0;
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;
delay_5us();
IIC_SCL=1;
delay_5us();
IIC_SCL=0;
delay_5us();
}
}
/*
**************************************************************************************
** brief : 讀1個(gè)字節(jié)
** ack :1.發(fā)送ACK,0.發(fā)送NACK
** note : 主機(jī)作為接收方,發(fā)送一個(gè)非應(yīng)答信號(hào)表示數(shù)據(jù)傳輸結(jié)束
** 發(fā)送一個(gè)應(yīng)答信號(hào)表示數(shù)據(jù)接收成功
** 從機(jī)作為接收方,發(fā)送一個(gè)非應(yīng)答信號(hào)表示數(shù)據(jù)接受失敗
** 發(fā)送一個(gè)應(yīng)答信號(hào)表示數(shù)據(jù)接收成功
**************************************************************************************
*/
u8 bsp_iic_readByte(unsigned char ack)
{
unsigned char i,receive=0;
delay_5us();
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_5us();
IIC_SCL=1;
receive<<=1;
delay_5us();
if(READ_SDA)receive++;
delay_5us();
}
if (!ack)
bsp_iic_nAck();
else
bsp_iic_ack();
return receive;
}
文件(24cxx.h)
u8 bsp_eeprom_readOneByte(u16 ReadAddr);
void bsp_eeprom_writeOneByte(u16 WriteAddr,u8 DataToWrite);
void bsp_eeprom_writeLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len);
u32 bsp_eeprom_readLenByte(u16 ReadAddr,u8 Len);
void bsp_eeprom_write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite);
void bsp_eeprom_read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead);
u8 bsp_eeprom_writePage_zero(u16 WriteAddr, u8 data, u16 NumToWrite);
void bsp_eeprom_init(void);
void bsp_eeprom_reset(void);
文件(24cxx.c)
#define AT24C01 127
#define AT24C02 255
#define AT24C04 511
#define AT24C08 1023
#define AT24C16 2047
#define AT24C32 4095
#define AT24C64 8191
#define AT24C128 16383
#define AT24C256 32767
#define EE_TYPE AT24C256
#define EE_PAGE_SIZE 64
/*
**************************************************************************
** note : 1. EEPROM高四位地址固定為1010
** 2. 主設(shè)備在從從設(shè)備接收到最后一個(gè)字節(jié)后發(fā)送
** 一個(gè)NACK 。接收到NACK 后,從設(shè)備釋放對(duì)SCL和SDA
** 線的控制;主設(shè)備就可以發(fā)送一個(gè)停止/ 重起始
** 條件
** 3. 在EEPROM的一次寫循環(huán)中可以寫多個(gè)字節(jié),但一次
** 寫入的字節(jié)數(shù)不能超過(guò)EEPROM的頁(yè)大小
*************************************************************************
*/
void bsp_eeprom_init(void)
{
bsp_eeprom_reset();
delay_ms(1);
}
/* brief : EEPROM復(fù)位*/
void bsp_eeprom_reset(void)
{
u32 i;
//OSSchedLock();
bsp_iic_Start();
SDA_OUT();
delay_us(1);
IIC_SDA = 1;
for(i=0; i<9; ++i) {
delay_us(1);
IIC_SCL = 1;
delay_us(1);
IIC_SCL = 0;
}
SDA_IN();
bsp_iic_Start();
IIC_Stop();
//OSSchedUnlock();
}
/*
**********************************************************
** brief : 讀數(shù)據(jù)
** ReadAddr : 待讀數(shù)據(jù)地址
** ret : 讀出的數(shù)據(jù)
**********************************************************
*/
u8 bsp_eeprom_readOneByte(u16 ReadAddr)
{
u8 temp=0;
//OSSchedLock();
bsp_iic_Start();
if(EE_TYPE>AT24C16)
{
bsp_iic_sendByte(0XA0); /*發(fā)送寫命令*/
bsp_iic_waitAck();
bsp_iic_sendByte(ReadAddr>>8);/*發(fā)送高地址*/
} else {
bsp_iic_sendByte(0XA0+((Re