2017-11-04 25 views
2

2つのデバイスをI2Cに接続したいとします。しかし、私はI2cを動作させることはありません。私はたくさんのウェブサイトを見てみましたが、まだ成功していません。私は私の回路をオシロスコープに接続し、それから送信していることを知っていました。STM32L152のI2Cが機能しません

私は良いものすべてを接続し、プルアップ抵抗を追加しました。ここで

は私のコードです:

#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); 
} 
+0

HTTPSを確認してください:// stackoverflowの.com/help/mcve。 'I2C_Read'関数は関連していないので、インクルードするべきではありません。 – jwdonahue

+0

'I2C_Write'で' errReturn'ラベルを打っていないことをどのように知っていますか? – jwdonahue

+0

'#define Timed(x)Timeout = 0xFFFF; while(x){if(Timeout - == 0)goto errReturn;} 'は信頼できるタイマーではありません。非常に速く 'x'で呼び出されている関数があれば、それを実行することができます。 – jwdonahue

答えて

2

ただの推測:

RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); 

に変更し、それを:あなたはにタイプミスがあり

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); 
+0

ああありがとう!今、私はオシロスコープ上で何か起きているが、依然として有効なI2C信号ではないことを知っています。 – mbakker1996

+1

私はあなたがスコープで何が起こっているのか把握する必要があると思います。通常、デバイスのデータシートにはI2C信号波形があります。 –

関連する問題