我是一名工科学生,在我的学士论文中,我使用了一个 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);
}