Я использую контроллер STM8S103 и взаимодействую с RT C DS1307 и SD CC компилятором. Я столкнулся с проблемой при общении. Когда я включаю прерывание для ITEVTEN , контроллер застревает. Вот код, который я пытаюсь сделать. Я использую семь сегментов для отображения чисел. Поэтому, когда сегмент застревает, цифры не отображаются. но если я отключу прерывание ITEVTEN , то сегмент будет работать правильно. Итак, ясно, что проблема с прерыванием по событию i2 c.
#include "stm8.h"
#include <stdint.h>
#include "i2c.h"
#define mSTART_CONDITION() {I2C_CR2 |=0x01;}
#define mSTOP_CONDITION() {I2C_CR2 |=0x02;}
#define mI2C_CMD_ENABLE() {I2C_CR1 |= mI2C_PERIPHERAL_ENABLE;}
#define mI2C_ACK() {I2C_CR2 |=0x04;}
#define mI2C_NACK() {I2C_CR2 &=~0x04;}
#define I2C_SR1_SB (I2C_SR1 & 0x01)
#define I2C_SR1_ADDR (I2C_SR1 & 0x02)
#define I2C_SR1_RXNE (I2C_SR1 & 0x40)
#define mI2C_PERIPHERAL_ENABLE 0x01
#define mREAD_RTC_DATA() mSTART_CONDITION()
#define SLAVE_ADDRESS 0xD0
#define NUM_OF_BYTE_TO_READ 6
void i2cInit(void);
uint8_t i2chandlerState;
uint8_t reg;
extern uint8_t dat[7];
uint8_t gNumOfByteToRead = NUM_OF_BYTE_TO_READ;
void i2c_handler(void) __interrupt(I2C_INTERRUPT) {
if(I2C_SR1_SB)
{
reg = I2C_SR1;
I2C_DR = SLAVE_ADDRESS | 0x01;
return;
}
if(I2C_SR1_ADDR)
{
reg = I2C_SR1;
reg = I2C_SR3;
i2chandlerState |= 0x02;
return;
}
if(I2C_SR1_RXNE)
{
if(gNumOfByteToRead)
{
dat[NUM_OF_BYTE_TO_READ-gNumOfByteToRead] = I2C_DR;
gNumOfByteToRead--;
i2chandlerState |= 0x04;
}
else
{
mSTOP_CONDITION();
mI2C_NACK();
i2chandlerState |= 0x08;
}
return;
}
reg = I2C_SR1;
reg = I2C_SR3;
i2chandlerState |= 0x10;
}
void i2cInit(void){
I2C_CR1 &= ~mI2C_PERIPHERAL_ENABLE;
I2C_FREQR = 16;
I2C_CCRH = 0x00;
I2C_CCRL = 0xa0;
I2C_OARH = 1; //As per datasheet it should be 1
I2C_OARL = 0;
I2C_TRISER = 17;
I2C_ITR = 0X05;
I2C_CR2 |= 0X04;
I2C_CR1 |= mI2C_PERIPHERAL_ENABLE;
}