您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > STM32F103读写24C02程序,使用过肯定能用
//实验24C02连接在PF口//WP、A0、A1、A2都接地#includestm32f10x_flash.h#includestm32f10x_gpio.h#includestm32f10x_rcc.h#defineAT24C020xa0//AT24C02地址/********************************变量定义---------------------------------------------------------*/GPIO_InitTypeDefGPIO_InitStructure;//GPIOErrorStatusHSEStartUpStatus;unsignedcharCount1,Count2;unsignedintUSEC;staticvu32TimingDelay;unsignedcharReadzfc;unsignedcharpDat[8]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};unsignedcharR_Dat[8];/*********************************声明函数-----------------------------------------------*/voidRCC_Configuration(void);voidSysTick_Configuration(void);voidDelay_us_24C02(u32nTime);/************************************24C02硬件接口******************************/#defineSDataGPIO_Pin_6//I2C时钟#defineSCLKGPIO_Pin_7//I2C数据/********************************宏定义*******************************************/#defineSCL(x)x?GPIO_SetBits(GPIOF,SCLK):GPIO_ResetBits(GPIOF,SCLK)#defineSDA(x)x?GPIO_SetBits(GPIOF,SData):GPIO_ResetBits(GPIOF,SData)/********************************变量*******************************************/u8ack;/*******************************************************************起动总线函数函数原型:voidStart_I2c();功能:启动I2C总线,即发送I2C起始条件.********************************************************************/voidStart_I2c(){SDA(1);//SDA=1;发送起始条件的数据信号Delay_us_24C02(1);SCL(1);//SCL=1;Delay_us_24C02(5);//起始条件建立时间大于4.7us,延时SDA(0);//SDA=0;/*发送起始信号*/Delay_us_24C02(5);//起始条件锁定时间大于4μsSCL(0);//SCL=0;/*钳住I2C总线,准备发送或接收数据*/Delay_us_24C02(2);}/*******************************************************************结束总线函数函数原型:voidStop_I2c();功能:结束I2C总线,即发送I2C结束条件.********************************************************************/voidStop_I2c(){SDA(0);//SDA=0;//发送结束条件的数据信号Delay_us_24C02(1);//发送结束条件的时钟信号SCL(1);//SCL=1;结束条件建立时间大于4μsDelay_us_24C02(5);SDA(0);//SDA=1;发送I2C总线结束信号Delay_us_24C02(4);}/*******************************************************************字节数据发送函数函数原型:voidSendByte(UCHARc);功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)发送数据正常,ack=1;ack=0表示被控器无应答或损坏。********************************************************************/voidSendByte(unsignedcharc){unsignedcharBitCnt;for(BitCnt=0;BitCnt8;BitCnt++)//要传送的数据长度为8位{if((cBitCnt)&0x80)SDA(1);//SDA=1;判断发送位elseSDA(0);//SDA=0Delay_us_24C02(1);SCL(1);//SCL=1置时钟线为高,通知被控器开始接收数据位Delay_us_24C02(5);//保证时钟高电平周期大于4μsSCL(0);//SCL=0}Delay_us_24C02(2);SDA(1);//SDA=1位发送完后释放数据线,准备接收应答位Delay_us_24C02(2);SCL(1);//SCL=1Delay_us_24C02(3);if(GPIO_ReadInputDataBit(GPIOF,SData)==1)ack=0;elseack=1;//判断是否接收到应答信号SCL(0);//SCL=0;Delay_us_24C02(3);}/*******************************************************************字节数据接收函数函数原型:UCHARRcvByte();功能:用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。********************************************************************/unsignedcharRcvByte(){unsignedcharretc;unsignedcharBitCnt;retc=0;SDA(1);//SDA=1置数据线为输入方式for(BitCnt=0;BitCnt8;BitCnt++){Delay_us_24C02(1);SCL(0);//SCL=0置时钟线为低,准备接收数据位Delay_us_24C02(5);//时钟低电平周期大于4.7μsSCL(1);//SCL=1置时钟线为高使数据线上数据有效Delay_us_24C02(2);retc=retc1;if(GPIO_ReadInputDataBit(GPIOF,SData)==1)retc=retc+1;//SDA==1读数据位,接收的数据位放入retc中Delay_us_24C02(2);}SCL(0);//SCL=0;Delay_us_24C02(2);return(retc);}/********************************************************************应答子函数函数原型:voidAck_I2c(bita);功能:主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)********************************************************************/voidAck_I2c(u8a){if(a==0)SDA(0);//SDA=0;在此发出应答或非应答信号elseSDA(1);//SDA=1;Delay_us_24C02(3);SCL(1);//SCL=1;Delay_us_24C02(4);//时钟低电平周期大于4μsSCL(0);//SCL=0;清时钟线,钳住I2C总线以便继续接收Delay_us_24C02(2);}//AT2402的功能函数/*******************************************************************向有子地址器件发送多字节数据函数函数原型:bitISendStr(UCHARsla,UCHARsuba,ucahr*s,UCHARno);功能:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。********************************************************************/u8ISendStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno){unsignedchari;Start_I2c();/*启动总线*/SendByte(sla);/*发送器件地址*/if(ack==0)return(0);SendByte(suba);/*发送器件子地址*/if(ack==0)return(0);for(i=0;ino;i++){SendByte(*s);/*发送数据*/if(ack==0)return(0);s++;}Stop_I2c();/*结束总线*/return(1);}/*******************************************************************向有子地址器件读取多字节数据函数函数原型:bitRecndStr(UCHARsla,UCHARsuba,ucahr*s,UCHARno);功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。********************************************************************/u8IRcvStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno){unsignedchari;Start_I2c();/*启动总线*/SendByte(sla);/*发送器件地址*/if(ack==0)return(0);SendByte(suba);/*发送器件子地址*/if(ack==0)return(0);Start_I2c();/*重新启动总线*/SendByte(sla+1);if(ack==0)return(0);for(i=0;ino-1;i++){*s=RcvByte();/*发送数据*/Ack_I2c(0);/*发送就答位*/s++;}*s=RcvByte();Ack_I2c(1);/*发送非应位*/Stop_I2c();/*结束总线*/return(1);}voidDelay(vu32nCount){for(;nCount!=0;nCount--);}voidDelay_us_24C02(u32nTime){unsignedintUSEC=0;while(USEC!=10000){USEC++;}}intmain(){#ifdefDE
本文标题:STM32F103读写24C02程序,使用过肯定能用
链接地址:https://www.777doc.com/doc-2860906 .html