首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32L152上的I2C不起作用

STM32L152上的I2C不起作用
EN

Stack Overflow用户
提问于 2017-11-05 06:06:56
回答 1查看 486关注 0票数 2

我想用I2C连接2台设备。但我不能让I2c正常工作。我试了很多,看了很多网站,但还是没有成功。我把我的电路连接到一个示波器上,然后我发现没有发送。

我把所有东西都接好了,还加了一个上拉电阻。

下面是我的代码:

代码语言:javascript
复制
#include <stddef.h>
#include "stm32l1xx.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx_i2c.h"
#include "stm32l1xx_gpio.h"
#include "core_cmFunc.h"


#define Timed(x) Timeout = 0xFFFF; while (x) { if (Timeout-- == 0) goto errReturn;}

void I2C_LowLevel_Init() {
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    GPIO_StructInit(&GPIO_InitStructure); // configure I#C clock and GPIO

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    //Configure pins: SCL and SDA ------------------
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

//    I2C1 reset
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);

    I2C_StructInit(&I2C_InitStructure);
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = 1;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = GPIO_Speed_400KHz;

    I2C_Init(I2C1, &I2C_InitStructure);
    I2C_Cmd(I2C1, ENABLE);
}


int I2C_Write(const uint8_t *buf, uint32_t nbyte, uint8_t SlaveAddress) {
    uint32_t Timeout = 0;
    if (nbyte) {
        Timed(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
//      Intiate Start Sequence
        I2C_GenerateSTART(I2C1, ENABLE);
        Timed(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
//      Send Address EV5
        I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Transmitter);
        Timed(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//      EV6 Write first byte EV8_1
        I2C_SendData(I2C1, *buf++);
        while (--nbyte) {
//      wait on BTF
            Timed(!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF));
            I2C_SendData(I2C1, *buf++);
        }
        Timed(!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF));
        I2C_GenerateSTOP(I2C1, ENABLE);
        Timed(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF));
    }
    return 1;

    errReturn:
    return -1;
}

int main(void) {
    uint8_t buf[] = {0x01, 0x00, 0x13, 0xFF};
    I2C_LowLevel_Init();
    I2C_Write(&buf, 4, 0x20);
}
EN

回答 1

Stack Overflow用户

发布于 2017-11-05 07:05:54

我猜一下:你有一个拼写错误:

代码语言:javascript
复制
    RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

将其更改为:

代码语言:javascript
复制
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47116089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档