历史上的今天
今天是:2025年03月07日(星期五)
2018年03月07日 | STM32模拟IIC程序
2018-03-07 来源:eefocus
#ifndef __AT24C02_H__
#define __AT24C02_H__
#include"stm32f10x.h"
void iICinit(void);
void iicwrite(u8 add,u8 Achar);
u8 iicread(u8 add);
#endif
#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_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void iicstart(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_7); //sda=1;
delay5us();
GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1;
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_7); //sda=0;
delay5us();
}
void iicstop(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_7); //sda=0;
delay5us();
GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1;
delay5us();
GPIO_SetBits(GPIOB,GPIO_Pin_7); //sda=1;
delay5us();
}
void ack(void)
{
u16 i;
GPIO_SetBits(GPIOB,GPIO_Pin_6);//scl=1;
delay5us();
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)&&(i<0x2b0)) {i++;}
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0;
delay5us();
}
void iicwritebyte(u8 a)
{
u16 i;
GPIO_ResetBits(GPIOB,GPIO_Pin_6); //scl=0;
delay5us();
for(i=0;i<8;i++)
{
if(a&0x80)
GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1;
else
GPIO_ResetBits(GPIOB,GPIO_Pin_7);;
a=a<<1;
GPIO_SetBits(GPIOB,GPIO_Pin_6);//scl=1;
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0;
delay5us();
}
GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1;
delay5us();
}
u8 iicreadbyte()
{
u8 i,temp;
temp=0;
GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1;
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_6); //scl=0;
delay5us();
for(i=0;i<8;i++)
{
GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1;
delay5us();
delay5us();
temp=(temp<<1)|GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_6); //scl=0;
delay5us();
}
GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1;
delay5us();
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0;
delay5us();
return temp;
}
void iicwrite(u8 add,u8 Achar)
{
iicstart();
iicwritebyte(0xa0);
ack();
iicwritebyte(add);
ack();
iicwritebyte(Achar);
ack();
iicstop();
delayms(20);
}
u8 iicread(u8 add)
{
u8 temp;
iicstart();
iicwritebyte(0xa0);
ack();
iicwritebyte(add);
ack();
iicstart();
iicwritebyte(0xa1);
ack();
temp=iicreadbyte();
ack();
iicstop();
return temp;
}
上一篇:STM32 延时函数封装程序
下一篇:STM32驱动1602程序
史海拾趣
|
电路设计技术与技巧(第二版)国外牛人Tim Williams著 国际电子大侠Tim Williams(蒂姆·威廉斯)著 内容简介 本书较全面和系统地讲述了在实际电子电路设计中常见问题和容易忽视的方方面面, 涵盖了设计产品所需是的全面知识,包括印制电路板布线和接地、有源和无源器件、模拟和数字集成电路、电源、电 ...… 查看全部问答> |
|
WINCE6.0操作系统在三星6410开发板上完美展现!--基于立宇泰ARMSYS6410开发板 精彩测评实例图片说明:1,WINCE6.0系统启动画面(进度条动态显示内核加载进程,LOGO图片可以根据客户需要免费更换);2,WINCE6.0桌面效果;3,800x480液晶屏全屏播放H.264视频流文件(采用硬件解码)4,800x480液晶屏全屏播放MPEG4(avi后缀)音视 ...… 查看全部问答> |
|
本人在一个项目中运用Ecan进行通信,在通信过程中会碰到中断故障(具体原因说不上来)。我是将Ecan设置成中断接收的(邮箱0-15设置成接收邮箱,16邮箱设置成发送邮箱),若接收到一个合理的读写命令,则返回 ...… 查看全部问答> |




