STM32使用模拟IIC操作EEPROM
头文件部分i2c.h
#ifndef _i2c_H_
#define _i2c_H_
#include "stm32f10x.h"
#define countof(a) (sizeof(a)/sizeof(*(a)))
#define GPIOA_IDR_Addr (GPIOA_BASE + 8) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE + 8) //
/*位带操作,实现51类似的GPIO控制功能*/
/*IO口操作宏定义 */
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+ \
0x2000000+((addr &0xFFFFF)<5)+(bitnum<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
//IO方向设置
#define SDA_IN() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<12;}
#define SDA_OUT() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<12;}
//IO操作函数
#define IIC_SCL PAout(2) //SCL---PA2
#define IIC_SDA PAout(3) //SDA---PA3
#define READ_SDA PAin(3) //输入SDA
#define EEPROM_SLAVE_ADDRESS (0x50)
//IIC所有操作函数
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
unsigned char IIC_Read_Byte( void );//IIC读取一个字节
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
unsigned char eeprom_write(unsigned char c_slave_address7bit,unsigned char c_reg_address,unsigned char u_data);
unsigned char eeprom_read(unsigned char c_slave_address7bit,unsigned char c_reg_address);
unsigned char eeprom_continue_read(unsigned char c_slave_address7bit,unsigned char c_reg_address,
unsigned char c_continue_read_arr[],unsigned int len);
unsigned char eeprom_continue_write(unsigned char c_slave_address7bit,unsigned char c_reg_address,
unsigned char c_continue_write_arr[],unsigned int len);
unsigned char read_eeprom_status(unsigned char c_slave_address7bit);
#endif
源码i2c.c
#include "i2c.h"
#include "stm32f10x.h"
static void Delay_us(int value)
{
int i = 0,j;
for(i = 0 ; i < 5 ; i ++)
for(j = 0 ; j < value ; j ++)
;
}
//////////////////////////////////////////////////////////////////////////
// 函数名 : IIC_Init
// 功能 : 初始化i2c
// 参数 : void
// 作者 : wit_yuan
// 时间 : 2014-11-07
////////////////////////////////////////////////////////////////////////////
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_2); //PA2,PA3 输出高
GPIO_SetBits(GPIOA,GPIO_Pin_3); //PA2,PA3 输出高
}
//////////////////////////////////////////////////////////////////////////
// 函数名 : IIC_Start
// 功能 : i2c起始信号
// 参数 : void
// 作者 : wit_yuan
// 时间 : 2014-11-07
////////////////////////////////////////////////////////////////////////////
void IIC_Start(void)
{
SDA_OUT(); //由于上一个SCL状态是0或者是1,要让SDA稳定输出,都可以设置为1。
IIC_SDA=1;
Delay_us(2);
IIC_SCL=1; //让SCL发生变化,为0不变,为1则变化,表明数据可以变动了。
Delay_us(2);
IIC_SDA=0; //SDA线数据变化,从而可以保证发出的是start信号。
Delay_us(2);
IIC_SCL=0; //将I2C
STM32模拟IIC操作EEPRO 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)