高级会员

- 积分
- 681
- 金钱
- 681
- 注册时间
- 2013-8-16
- 在线时间
- 37 小时
|

楼主 |
发表于 2013-9-2 10:35:38
|
显示全部楼层
#include"stm32f10x.h"
#include"at24c02.h"
void iicstart(void);
void iicstop(void);
void ack(void);
void iicwritebyte(u8 a);
u8 iicreadbyte(void);
void iicwrite(u8 add,u8 Achar);
u8 iicread(u8 add);
void iicinit(void);
/////////////////////////////
void delay5us(void)//ums
{
unsigned short i, j;
unsigned short time;
time=5;
for(; time > 0; time--){
for(j = 0; j < 5; j++){
for(i = 0; i < 1; i++);
}
}
}
void delayms(unsigned short time)//nms
{
unsigned short i, j;
for(; time > 0; time--){
for(j = 0; j < 10; j++){
for(i = 0; i < 1004; i++);
}
}
}
void iicinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void iicstart(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_11); //sda=1;
delay5us();
GPIO_SetBits(GPIOB,GPIO_Pin_10); //scl=1;
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_11); //sda=0;
delay5us();
}
void iicstop(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_11); //sda=0;
delay5us();
GPIO_SetBits(GPIOB,GPIO_Pin_10); //scl=1;
delay5us();
GPIO_SetBits(GPIOB,GPIO_Pin_11); //sda=1;
delay5us();
}
void ack(void)
{
u16 i;
GPIO_SetBits(GPIOB,GPIO_Pin_10);//scl=1;
delay5us();
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)&&(i<0x2b0)) {i++;}
GPIO_ResetBits(GPIOB,GPIO_Pin_10);//scl=0;
delay5us();
}
void iicwritebyte(u8 a)
{
u16 i;
GPIO_ResetBits(GPIOB,GPIO_Pin_10); //scl=0;
delay5us();
for(i=0;i<8;i++)
{
if(a&0x80)
GPIO_SetBits(GPIOB,GPIO_Pin_11);//sda=1;
else
GPIO_ResetBits(GPIOB,GPIO_Pin_11);;
a=a<<1;
GPIO_SetBits(GPIOB,GPIO_Pin_10);//scl=1;
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_10);//scl=0;
delay5us();
}
GPIO_SetBits(GPIOB,GPIO_Pin_11);//sda=1;
delay5us();
}
u8 iicreadbyte()
{
u8 i,temp;
temp=0;
GPIO_SetBits(GPIOB,GPIO_Pin_11);//sda=1;
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_10); //scl=0;
delay5us();
for(i=0;i<8;i++)
{
GPIO_SetBits(GPIOB,GPIO_Pin_10); //scl=1;
delay5us();
delay5us();
temp=(temp<<1)|GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_10); //scl=0;
delay5us();
}
GPIO_SetBits(GPIOB,GPIO_Pin_11);//sda=1;
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_10);//scl=0;
delay5us();
return temp;
}
void iicwrite(u16 add,u8 Achar)
{
u8 add1,add2;
add1=add>>8;//获取地址高八位
add2=add&0x00FF;//获取地址的低八位
iicstart();
iicwritebyte(0xa0);//写函数指令
ack();//应答
iicwritebyte(add1);//写地址的高八位
ack();
iicwritebyte(add2);//写地址的低八位
ack();
iicwritebyte(Achar);//写入数据
ack();
iicstop();
delayms(20);
}
u8 iicread(u16 add)
{
u8 add1,add2;
u8 temp;
add1=add>>8;
add2=add&0x00FF;
iicstart();
iicwritebyte(0xa0);//读指令
ack();
iicwritebyte(add1);
ack();
iicwritebyte(add2);
ack();
iicstart();
iicwritebyte(0xa1);//写指令
ack();
temp=iicreadbyte();
ack();
iicstop();
return temp;
} |
|