在C中使用STM8s无法通过I2C发送数据

问题描述 投票:0回答:0

我是一名工科学生,在我的学士论文中,我使用了一个 16 通道 IO 扩展器,该扩展器通过 STM8S 微控制器与 I2C 通信。

现在在以前的项目中,我使用 SPI 在模块(相同的 µC)之间进行通信,并且它按我想要的方式工作。

问题在于

I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
宏。 我发现了一个类似的帖子,但它似乎很死:“i2c stm8 issue with event

我用的是控制器的标准外设库。这是我的 main.c 文件。现在我pseudo'ed 使用@-symbol 我的代码来使这个问题更清晰,你可以假设这些部分已经过良好的测试和工作。也可以假定宏是正确的。硬件调试相当困难,因为一切都集成在 PCB 上。

@inclusion of "stm8s.h", "stm8s_gpio.h", "stm8s_delay.h" and "stm8s_i2c.h"

@defining of C and D port

@defining P1,P2,... Pin macros

@defining I2C_SLAVE_ADDRESS, I2C_OUTPUT_CLK_FREQ, I2C_OWN_ADDRESS, I2C_INTERNAL_CLK_FREQ   
@defining BLINK_LED_A,... macros

@defining I2C flag checking macros

#define wait ;

void I2C_Setup(void);

void main()
{
    uint8_t rgbMSB, rgbLSB;

    @initiating GPIO

    I2C_DeInit();
    I2C_Setup(); // see below this main function

    while (1)
    {
        DEBUG_LED_B();

        while (I2C_BUS_IS_BUSY) // ok
            wait
            DEBUG_LED_A();

        I2C_GenerateSTART(ENABLE);
        while (I2C_MASTER_MODE_NOT_SELECTED) // ok
            wait
            DEBUG_LED_B();

        I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_TX);
        while(I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCES); // here the program goes into infinite loop

        DEBUG_LED_A();

        I2C_SendData(rgbLSB);

        while (I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS)
            ;
        DEBUG_LED_B();
        I2C_SendData(rgbMSB);
        I2C_AcknowledgeConfig(I2C_ACK_NONE);
        I2C_GenerateSTOP(ENABLE);
        delay_ms(500);
    }
}

void I2C_Setup(void)
{
    u8 Input_Clock = 0;
    Input_Clock = CLK_GetClockFreq() / 1000000;
    I2C_Init(I2C_OUTPUT_CLK_FREQ, I2C_OWN_ADDRESS, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, Input_Clock);
}

因为我不知道我的罐子出了什么问题,所以我会礼貌地问你们 a) 你们有没有遇到过类似的问题,你们是如何解决的,b) 是软件问题还是硬件问题,c)提供一个关于如何解决这个问题的起点。

我尝试否定事件和标志,显然它不起作用。 我试图立即执行以下操作,但没有用。

// previous code
while(1){
I2C_GenerateSTART(ENABLE);
I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_TX);
I2C_SendData(rgbLSB);
I2C_SendData(rgbMSB);
I2C_AcknowledgeConfig(I2C_ACK_NONE);
I2C_GenerateSTOP(ENABLE);
delay_ms(500);
}
c microcontroller i2c stm8
© www.soinside.com 2019 - 2024. All rights reserved.