stm8s I2 C мастер-код зависает после включения прерывания ITEVTEN - PullRequest
0 голосов
/ 12 июля 2020

Я использую контроллер 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;
}
...