读写程序亲自编写测试可用_第1页
读写程序亲自编写测试可用_第2页
读写程序亲自编写测试可用_第3页
读写程序亲自编写测试可用_第4页
读写程序亲自编写测试可用_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本文档内容为在STM32条件下的24C02读写程序。全文共分四部分,第一部分24C02的C程序,第二部分为24C02的.h程序,第三部分为端口与时钟配置函数,第四部分为主函数。下面分别进行介绍。第一部分:24C02的.c函数*/#include "stm32f10x.h"#include "system_config.h"#include "24C02.h"u8 savedata10=10,9,8,7,6,5,4,3,2,1;/* Function Name : AT24C02_SDA_IO_SET(uchar io_set)* De

2、scription : SDA方向控制* Input : None* Output : None* Return : None*/void AT24C02_SDA_IO_SET(unsigned char io_set) GPIO_InitTypeDef GPIO_InitStructure; if(io_set) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;/SDA 设置为输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mo

3、de_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); else GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;/SDA 设置为输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Function Name : delay2* Description :

4、延时函数* Input : None* Output : None* Return : None*/ void delay2(u8 x) u8 i; for(i=0;i<x;i+); /* Function Name : delay2* Description : 延时函数* Input : None* Output : None* Return : None*/void delay_nop(void) uint8_t i=10;/延时1.5us while(i-);/* Function Name : 24C02_init()* Description : 初始化函数* Input :

5、 None* Output : None* Return : None*/void I2C_init(void) /SCL=1 SCL_H; delay_nop(); /SDA=1 SDA_H; delay_nop();/* Function Name : I2C_start()* Description : 开始信号* Input : None* Output : None* Return : None*/void I2C_start() SDA_H; delay_nop(); SCL_H; delay_nop(); SDA_L; delay_nop(); SCL_L; delay_nop(

6、);/* Function Name : I2C_stop()* Description : 开始信号* Input : None* Output : None* Return : None*/ void I2C_stop() SDA_L; delay_nop(); SCL_H; delay_nop(); SDA_H; delay_nop();/* Function Name : I2C_write_bit()* Description : 开始信号* Input : None* Output : None* Return : None*/ void I2C_write_bit(int j)

7、int i,temp,temp1; temp=j; /AT24C02_SDA_IO_SET(1);/发送数据 for(i=0;i<8;i+) temp1=temp&0x80;/高位在前相与 temp=temp<<1; SCL_L;/时钟线设为低 delay_nop(); if(temp1=0x80)/发送数据到SDA线上 SDA_H; delay_nop(); else SDA_L; delay_nop(); SCL_H;/时钟线设为高,开始传输数据 delay_nop(); SCL_L;/一个字节发送完成 delay_nop(); SDA_H; delay_nop(

8、);/* Function Name : I2C_read_bit()* Description : 读取一个字节数据* Input : None* Output : None* Return : None*/ u8 I2C_read_bit() u8 i,j,k=0; SCL_L; delay_nop(); SDA_H; delay_nop(); AT24C02_SDA_IO_SET(0);/SDA设置为输入 for(i=0;i<8;i+) delay_nop(); SCL_H; delay_nop(); if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_

9、7)=1) j=1; else j=0; k=(k<<1)|j; SCL_L; delay_nop(); AT24C02_SDA_IO_SET(1);/SDA设置为输出 delay_nop(); return(k);/* Function Name : I2C_reply()* Description : 读取应答信号* Input : None* Output : None* Return : None*/ void I2C_reply() u16 i=0; AT24C02_SDA_IO_SET(0);/SDA设置为输入 SCL_H; delay_nop(); while(GPI

10、O_ReadInputDataBit(GPIOB,GPIO_Pin_7)=1)&&(i<5000) i+; SCL_L; delay_nop(); AT24C02_SDA_IO_SET(1);/SDA设置为输出/* Function Name : I2C_write_addr()* Description : 指定地址写* Input : None* Output : None* Return : None*/ void I2C_write_addr(u8 addr,u8 data) I2C_start();/开始信号 I2C_write_bit(0xa0);/发送写命令

11、 I2C_reply();/等待应答 I2C_write_bit(addr);/发送写地址 I2C_reply();/等待应答 I2C_write_bit(data);/发送写数据 I2C_reply();/等待应答 I2C_stop();/停止信号 delay2(250); /* Function Name : I2C_read_addr()* Description : 指定地址读* Input : None* Output : None* Return : None*/ int I2C_read_addr(int addr) int i=0; I2C_start();/开始信号 I2C_

12、write_bit(0xa0);/发送写命令 因为要先写入要读的地址 I2C_reply();/等待应答 I2C_write_bit(addr);/发送读地址 I2C_reply();/等待应答 I2C_start();/开始信号 I2C_write_bit(0xa1);/发送读命令 I2C_reply();/等待应答 i=I2C_read_bit(); I2C_stop();/停止信号 delay2(250); return(i); 第二部分:24C02的.h函数#define SCL_H GPIO_SetBits(GPIOB,GPIO_Pin_6)#define SCL_L GPIO_Re

13、setBits(GPIOB,GPIO_Pin_6)#define SDA_H GPIO_SetBits(GPIOB,GPIO_Pin_7)#define SDA_L GPIO_ResetBits(GPIOB,GPIO_Pin_7)#define Write_able GPIO_ResetBits(GPIOB,GPIO_Pin_5)/24C02写使能控制引脚void AT24C02_SDA_IO_SET(unsigned char io_set);void delay2(u8 x) ;void delay_nop(void);void I2C_init(void);void I2C_start(

14、);void I2C_stop();void I2C_write_bit(int j);u8 I2C_read_bit();void I2C_reply();void I2C_write_addr(u8 addr,u8 data) ;int I2C_read_addr(int addr) ;第三部分:端口与时钟配置函数由于我们使用的是PB6作为时钟线,PB7作为数据线,所以端口配置PB6,PB7就可以了。下面是端口配置函数void GPIO_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; /* 24C02相关配置*/ GPIO_

15、InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);时钟配置函数如下所示:void RCC_Configuration(void) /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE

16、*/ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus = SUCCESS) /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC

17、_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetF

18、lagStatus(RCC_FLAG_PLLRDY) = RESET) /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) /* GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/ /* Enable AFIO clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);第四部分:主函数int main(void) u8 i;#ifdef DEBUG debug();#endif RCC_C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论