yanjiesh 发表于 2013-12-6 14:43:08

STM3.5库I2C函数的应用求解,谢谢

正在写STM32F107VC 的应用程序, 需要用户I2C程序,想使用中断服务来发送和接收,看到3.5库里面有多个检查Flag、event、IT信息的函数以及清除flag等函数。没有相关例程,请教下高手,正常的操作流程,谢谢。

yanjiesh 发表于 2013-12-10 09:51:38

望穿秋水,未见来者。只能NXP了,哎。

fengdingkusong 发表于 2013-12-10 10:27:14

static void I2C_Configuration(void)
{
        I2C_InitTypeDefI2C_InitStructure;
        GPIO_InitTypeDefGPIO_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
   

        /* PB6,7 SCL and SDA */
        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);          //I2C接口使用的GPIO管脚初始化
       
    I2C_DeInit(I2C1);
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;         //设置I2C接口模式
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //设置I2C接口的高低电平周期
    I2C_InitStructure.I2C_OwnAddress1 = 0x30;          //设置I2C接口的主机地址
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;      //设置是否开启ACK响应         
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 100000;      //100K速度
   
        I2C_Cmd(I2C1, ENABLE);                            //使能I2C接口
        I2C_Init(I2C1, &I2C_InitStructure);               //I2C接口初始化
        /*允许1字节1应答模式*/
        I2C_AcknowledgeConfig(I2C1, ENABLE);            //使能I2C接口响应

}
rt_uint16_t IIC_Read()
{
        rt_uint16_t dataH = 0,dataL = 0;
        rt_uint16_t ret = 0;
        /* 起始位 */
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

        I2C_Send7bitAddress(I2C1, 0x46, I2C_Direction_Transmitter);        //写
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1, 0x01); //Power on
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        /* 停止位*/
        I2C_GenerateSTOP(I2C1, ENABLE);

        /* 起始位 */
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

        I2C_Send7bitAddress(I2C1, 0x46, I2C_Direction_Transmitter);        //写
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1, 0x10); //H- resolution mode
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        /* 停止位*/
        I2C_GenerateSTOP(I2C1, ENABLE);

        rt_thread_delay(20);//等待数据转换完成

        /* 起始位 */
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1, 0x46, I2C_Direction_Receiver);//读       
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
        dataH = I2C_ReceiveData(I2C1);

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
        dataL = I2C_ReceiveData(I2C1);
        I2C_GenerateSTOP(I2C1, ENABLE);
        ret = ((dataH << 8) | dataL);

        return ret;
}
之前操作一个IIC接口芯片的代码,可以参考下

fengdingkusong 发表于 2013-12-10 10:30:43

忘了,我用的103的芯片

yanjiesh 发表于 2013-12-10 14:21:29

fengdingkusong 发表于 2013-12-10 10:27
之前操作一个IIC接口芯片的代码,可以参考下

谢谢 fengdingkusong 朋友 ,古道热肠的人品! 虽然我想用的是中断方式,也在编写,但是项目时间短,只能改用LPC1766了,{:smile:} 。那个芯片和我原来的设计使用的是一个厂家的。

shengliangcumt 发表于 2013-12-24 10:13:06

{:smile:}看看

yanjiesh 发表于 2013-12-24 22:00:55

shengliangcumt 发表于 2013-12-24 10:13
看看

加油 shengliangcumt一起学习 :)
页: [1]
查看完整版本: STM3.5库I2C函数的应用求解,谢谢