完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
搞了 三天了还没搞出来。。。求大神帮忙啊
#include"STM32f10x.h" #include"stm32f10x_rcc.h" #include"stm32f10x_gpio.h" #include"stm32f10x_tim.h" #include"delay.h" #include"stm32f10x_i2c.h" void time() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清中断标志位 TIM_TimeBaseStructure.TIM_Period = 2000;//装初值 TIM_TimeBaseStructure.TIM_Prescaler = 3599;//设置分频系数 TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分频系数 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置定时器计数模式 TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure); TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE );//使能定时器2 中断 /* Enables the TIM2 counter */ TIM_Cmd(TIM2, ENABLE);//使能定时器外设 } void GPIOf() { GPIO_DeInit(GPIOF); /* Configure all the GPIOA in Input Floating mode */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP; GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); } void rcc() { RCC_DeInit(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//使能GPIOF的时钟 /* Enable BKP and TIM2 clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能定时器2 的时钟 //NVIC_enableIRQn(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); } void i2c() { I2C_InitTypeDef I2C_InitStructure; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 =0x01; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress =I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 40000; I2C_Cmd(I2C1, ENABLE); I2C_Init(I2C1, &I2C_InitStructure); } void NVIC_c() { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置中断优先级 NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;//设置中断优先级通道 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct);//初始化中断 } void i2() { uint16_t ReceivedData; /* 没有被复位 代表现在总线正忙 出现复位 总线空闲,执行下面的语句 */ while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET); /* 产生一个起始信号 */ I2C_GenerateSTART(I2C1, ENABLE); /* 检查主模式是否被选择 EV5是否被置位 */ while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); /* 发送从器件地址 */ I2C_Send7bitAddress(I2C1, 0xa0,I2C_Direction_Transmitter); /* 判断从器件地址是否匹配 EV1是否被置位 */ while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS); I2C_SendData(I2C1, 0x00); /* 等待从应答 */ while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS); I2C_SendData(I2C1, 0x5d); /* 等待从应答 */ while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS); /* 发送停止信号 */ I2C_GenerateSTOP(I2C1, ENABLE); I2C_GenerateSTART(I2C1, ENABLE); /* 检查主模式是否被选择 EV5是否被置位 */ while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS); /* 发送从器件地址 */ I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Transmitter); /* 判断从器件地址是否匹配 EV1是否被置位 */ while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS); I2C_SendData(I2C1, 0x00); /* 等待从应答 */ while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS); I2C_SendData(I2C1, 0x5d); /* 等待从应答 */ while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS); /* 发送停止信号 */ I2C_GenerateSTOP(I2C1, ENABLE); } int main() { rcc(); time(); // NVIC_c(); GPIOf(); i2c(); GPIO_SetBits(GPIOF, GPIO_Pin_6); while(1) { delay(1000); i2(); } } void TIM2_IRQHandler() { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); if(GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)==1) { GPIO_ResetBits(GPIOF, GPIO_Pin_6); //不能用两个 if 因为 当满足前一个if时 } else//输出寄存器的值已经被改变了 { GPIO_SetBits(GPIOF, GPIO_Pin_6);//也就满足了后面if的条件,所以 电平被改变后的瞬间又被改变回来 }//所以 表现出来 人眼看到的情况就是 没有改变电平 } |
|
相关推荐
10个回答
|
|
貌似103大家都用软件模拟
|
|
|
|
没搞定硬件IIC用软件模拟的
|
|
|
|
没写过F1的,之前写过一个F3的调试过
|
|
|
|
都说103的I2C 有问题,用模拟的
|
|
|
|
|
|
没搞过,帮顶
|
|
|
|
最好用模拟的
|
|
|
|
没跑过硬件,帮顶
|
|
|
|
103用IO模拟。论坛有很多例程,你搜一下就好了。
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1786 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1657 浏览 3 评论
4216 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1805 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2291 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-13 18:34 , Processed in 1.038780 second(s), Total 91, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号