L勿忘心安 发表于 2015-5-31 20:25:53

STM32F103ZE 硬件I2C怎么搞啊

搞了 三天了还没搞出来。。。求大神帮忙啊

#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的条件,所以 电平被改变后的瞬间又被改变回来

}//所以 表现出来 人眼看到的情况就是 没有改变电平

}


党国特派员 发表于 2015-5-31 20:35:04

貌似103大家都用软件模拟

laotui 发表于 2015-5-31 21:52:32

没搞定硬件IIC用软件模拟的

风子 发表于 2015-5-31 22:06:50

没写过F1的,之前写过一个F3的调试过

mark0668 发表于 2015-5-31 22:10:29

都说103的I2C 有问题,用模拟的

lkl0305 发表于 2015-5-31 22:54:27

帮顶:D:D

你好我好大家好! 发表于 2015-6-1 08:26:42

没搞过,帮顶

为什么是EEFOCUS小白 发表于 2015-6-1 09:12:07

最好用模拟的

数码小叶 发表于 2015-6-1 16:56:35

没跑过硬件,帮顶

发表于 2015-6-2 09:11:53

103用IO模拟。论坛有很多例程,你搜一下就好了。
页: [1] 2
查看完整版本: STM32F103ZE 硬件I2C怎么搞啊