完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include"STM32f10x.h"
#include //#define GPIO_Pin_10 SCL //#define GPIO_Pin_11 SDA /*延时*/ void Dealy_Ms(u16 x) {int i,j; for(i=0;i<1000;i++) for(j=0;j /*SCL SDA初始设置*/ void I2C_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; //选中第八引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率为50MHz GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //设置输出方式为复用开漏输出 GPIO_Init(GPIOB, &GPIO_InitStructure); } /*SDA设置函数 x为1时为上拉输入 为0时复用推挽输出*/ void SDAMODESET(int x) { GPIO_InitTypeDef GPIO_InitStructure; if(x==0) { GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //选中第八引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率为50MHz GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //设置输出方式为复用开漏输出 GPIO_Init(GPIOB, &GPIO_InitStructure); } if(x==1) { GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //选中第八引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率为50MHz GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //设置输出方式为复用开漏输出 GPIO_Init(GPIOB, &GPIO_InitStructure); } } /*释放总线 */ void free() {GPIO_SetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); GPIO_SetBits(GPIOB, GPIO_Pin_11); Dealy_Ms(2); } /*起始*/ void start() { GPIO_SetBits(GPIOB, GPIO_Pin_11); Dealy_Ms(2); GPIO_SetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); GPIO_ResetBits(GPIOB, GPIO_Pin_11); Dealy_Ms(2); } /*停止 */ void stop() { GPIO_ResetBits(GPIOB, GPIO_Pin_11); Dealy_Ms(2); GPIO_SetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); GPIO_SetBits(GPIOB, GPIO_Pin_11); Dealy_Ms(2); } /*应答 */ void response() { int i=0; GPIO_SetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); SDAMODESET(1); while((GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==1)&&(i<2550)) i++; GPIO_ResetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); SDAMODESET(0); } /*写入数据的单操作 要配合起始信号 应答信号等等*/ void writebyte(char data) { char i,temp,temp1; temp=data; for(i=0;i<8;i++) { temp1=temp&0x80; temp=temp<<1; GPIO_ResetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); if(temp1==0x80) GPIO_SetBits(GPIOB, GPIO_Pin_11); else GPIO_ResetBits(GPIOB, GPIO_Pin_11); Dealy_Ms(2); GPIO_SetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); } GPIO_ResetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); GPIO_SetBits(GPIOB, GPIO_Pin_11); Dealy_Ms(2); } /*读取数据的单操作 要配合起始信号 应答信号等等*/ readbyte() { int j,i,k=0; GPIO_ResetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); GPIO_SetBits(GPIOB, GPIO_Pin_11); SDAMODESET(1); for(j=0;j<8;j++) { Dealy_Ms(2); GPIO_SetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); if( GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==1 ) i=1; else i=0; k=(k<<1)|i; GPIO_ResetBits(GPIOB, GPIO_Pin_10); Dealy_Ms(2); } SDAMODESET(0); Dealy_Ms(2); return k; } /*写入数据的总操作M表示写入的数据 N 表示写入的地址*/ void writeonebyte(char M,int N) { free(); start(); writebyte(0xa0); response(); writebyte(N); response(); writebyte(M); response(); stop(); } /*读取数据的总操作 N表示读取数据的地址*/ readonebyte(int N) { int a; start(); writebyte(0xa0); response(); writebyte(N); response(); start(); writebyte(0xa1); response(); a=readbyte(); stop(); return a; } /*usart1串口设置*/ void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //定义结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //选中第八引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率为50MHz GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP; //设置输出方式为推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //取GPIO为GPIOC GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选中第2引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率为50MHz GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; //设置输出方式为推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //usart3串口时钟使能 USART_InitStructure.USART_BaudRate = 9600; //9600波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //八个字节 USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位为1位 USART_InitStructure.USART_Parity = USART_Parity_No; //无校验 USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //无硬件流 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //接收和发送功能使能 //USART_InitStructure.USART_Clock = USART_Clock_Disable; //USART_InitStructure.USART_CPOL = USART_CPOL_High; //USART_InitStructure.USART_CPHA = USART_CPHA_1Edge; //USART_InitStructure.USART_LastBit = USART_LastBit_Enable; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); //串口使能 USART_ITConfig(USART1, USART_IT_TC, DISABLE); USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } /*将printf函数指向USART1 发送数据时便可直接调用printf*/ int fputc(int ch,FILE *f) { USART1->SR; USART_SendData(USART1, ch); //ch送给USART1 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //等待发送完毕 return ch; //返回ch } /*向EEPROM写入数据并且将它们读出来(这里写入了两个数据)*/ int main(void) { char x=24; char y=58; int aa,bb; I2C_GPIO_Configuration(); USART1_Configuration(); writeonebyte( x,7); writeonebyte(y,9); printf("The write data: %d,%d",x,y); Dealy_Ms(20); aa=readonebyte(7); bb=readonebyte(9); printf(" The read data: %d,%d",aa,bb); while(1); } |
|
相关推荐
|
|
969 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
954 浏览 2 评论
2066 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1162 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1587 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 08:38 , Processed in 0.603363 second(s), Total 68, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号