logo资料库

STM32-模拟IIC读写24C02程序代码.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
STM32 模拟 IIC 读写 24C02 程序代码 引脚定义和配置: #define SCL #define SDA GPIO_Pin_6 //24C02 SCL GPIO_Pin_7 //24C02 SDA void GPIO_Configuration(void) { RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE); GPIO_InitStructure.GPIO_Pin = SCL; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //24C02 SCL GPIO_InitStructure.GPIO_Pin = SDA; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //24C02 SDA 作为输出 } void AT24C02_SDA_IO_SET(unsigned char io_set) //SDA 引脚输入输出设置 { if(io_set==0) //24C02 SDA 作为输出 { GPIO_InitStructure.GPIO_Pin = SDA; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } else if(io_set==1) { GPIO_InitStructure.GPIO_Pin = SDA; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //24C02 SDA 作为输入 //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure); } else {;} } /////////////////主程序 /////////////////// int main(void) { uchar i; uchar data_24c02; RCC_Configuration(); //时钟配置 GPIO_Configuration();//GPIO 配置 USARTx_configuration();//串口配置 WIN24C02_init(); delayms(5000);//延时 for(i=0;i<20;i++) //写 EEPROM 数据 { WIN24C02_write(0x00+i,i);delayms(100);}//存数据到 EEPROM delayms(1000);//延时 while(1)//串口 3 发送读取的 EEPROM 的数据 { for(i=0;i<20;i++) { data_24c02=WIN24C02_read(0x00+i);//读取 24C02 数据 USART_SendData(USART3 ,data_24c02); while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET); delayms(5000);//延时 } } } ////////////////////////////////////////////////////////////////////////////////////////////////////// /////////// WIN_24C02.H 头文件
STM32 24C02 读写程序 /**********************中文版本*******************************/ /*****功能描述 : *****/ /*****作 者 : /*****编写日期 : 2013 年 1 月 21 日 *****/ /*****版本信息 : V1.0 /*****修改日期 : *****/ /*************************************************************/ #ifndef __WIN24C02_H__ #define __WIN24C02_H__ *****/ *****/ #include"STM32_Config.h" #define uchar unsigned char #define uint unsigned int uchar WIN24C02_read(uchar address); //从 24c02 的地址 address 中读取一个字节数据 void WIN24C02_write(uchar address,uchar info); 据 info //向 24c02 的 address 地址中写入一字节数 void WIN24C02_init(); //24c02 初始化子程序 void delay_nop(void); void delay2(uint x); void start(); void stop(); void writex(uchar j); uchar readx(); void clock(); void delay2(uint x) { uint i; for(i=0;i
} void delay_nop(void) { uint8_t i=10; //i=10 延时 1.5us//这里可以优化速度 ,经测试最低到 5 还能写入 while(i--); } void WIN24C02_init() { //SCL=1; GPIO_SetBits(GPIOB,SCL); delay_nop(); //SDA=1; GPIO_SetBits(GPIOB,SDA); delay_nop(); } void start() { //SDA=1; GPIO_SetBits(GPIOB,SDA); delay_nop(); //SCL=1; GPIO_SetBits(GPIOB,SCL); delay_nop(); //SDA=0; GPIO_ResetBits(GPIOB, SDA); delay_nop(); //SCL=0; GPIO_ResetBits(GPIOB, SCL); delay_nop(); } void stop() { //SDA=0; GPIO_ResetBits(GPIOB, SDA); delay_nop();
//SCL=1; GPIO_SetBits(GPIOB,SCL); delay_nop(); //SDA=1; GPIO_SetBits(GPIOB,SDA); delay_nop(); } void writex(uchar j) { uchar i,temp,temp1; temp=j; //AT24C02_SDA_IO_SET(0); for (i=0;i<8;i++) { temp1=temp & 0x80; temp=temp<<1; //SCL=0; GPIO_ResetBits(GPIOB, SCL); delay_nop(); //SDA=CY; if(temp1==0x80) {GPIO_SetBits(GPIOB, SDA);} else {GPIO_ResetBits(GPIOB, SDA);} delay_nop(); // SCL=1; GPIO_SetBits(GPIOB,SCL); delay_nop(); } //AT24C02_SDA_IO_SET(0); //SCL=0; GPIO_ResetBits(GPIOB, SCL); delay_nop(); //SDA=1; GPIO_SetBits(GPIOB,SDA); delay_nop();
} uchar readx() { uchar i,j,k=0; //SCL=0; GPIO_ResetBits(GPIOB, SCL); delay_nop(); //SDA=1; GPIO_SetBits(GPIOB,SDA); AT24C02_SDA_IO_SET(1); for (i=0;i<8;i++) { delay_nop(); //SCL=1; GPIO_SetBits(GPIOB,SCL); delay_nop(); //if (SDA==1) j=1; if( GPIO_ReadInputDataBit(GPIOB,SDA)==1 ) {j=1;} else {j=0;} k=(k<<1)|j; //SCL=0; GPIO_ResetBits(GPIOB, SCL); } AT24C02_SDA_IO_SET(0); delay_nop(); return(k); } void clock() { uint i=0; AT24C02_SDA_IO_SET(1); //SCL=1; GPIO_SetBits(GPIOB,SCL); delay_nop(); while ((GPIO_ReadInputDataBit(GPIOB,SDA)==1)&&(i<5000))i++; //SCL=0;
GPIO_ResetBits(GPIOB, SCL); delay_nop(); AT24C02_SDA_IO_SET(0); } uchar WIN24C02_read(uchar address) uchar i; start(); writex(0xa0); clock(); writex(address); clock(); start(); writex(0xa1); clock(); i=readx(); stop(); //delay2(10); delay2(50); return(i); { } void WIN24C02_write(uchar address,uchar info) { } start(); writex(0xa0); clock(); writex(address); clock(); writex(info); clock(); stop(); //delay2(50); delay2(250); #endif
分享到:
收藏