Перейти к содержанию
    

TMS320F28388D: Постоянно вызываются прерывания по SPI и I2C

Здравствуйте, уважаемые форумчане!!!

мы приобрели следующий набор отладочных плат:
1. HSEC180 controlCARD Baseboard Docking Station
https://www.ti.com/tool/TMDSHSECDOCK
https://efind.ru/offer/TMDSHSECDOCK

2. F28388D controlCARD evaluation module
https://www.ti.com/tool/TMDSCNCD28388D
https://efind.ru/offer/TMDSCNCD28388D

сейчас я создал тестовый проект на основе примеров, которые идут с C2000Ware_3_02_00_00 для данного контроллера, в нем я хочу осуществить следующее:
1. передать данные по SPI, увидев, что отрабатывает прерывание и увеличивается счетчик переданных пакетов, встать осцилом на пины и увидеть клок и данные
2. передать данные по I2C, увидев, что отрабатывает прерывание и увеличивается счетчик переданных пакетов, встать осцилом на пины и увидеть клок и данные
3. проинициализировать CAN_A и CAN_B, замкнуть CAN_A_RX на CAN_B_TX, CAN_B_RX на CAN_A_TX, передать пакеты с CAN_A->CAN_B, затем с CAN_B->CAN_A, увидеть, как отрабатывают прерывания

void Test_Dev_Init(void){
    uint32_t pin = 0;
	
	///////////////////          I2C            /////////////////////////

    //I2C_A
    pin = 1; // SCL
    GPIO_setMasterCore(pin, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_1_SCLA);
    GPIO_setPadConfig(pin, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(pin, GPIO_QUAL_ASYNC);
    pin = 0; // SDA
    GPIO_setMasterCore(pin, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_0_SDAA);
    GPIO_setPadConfig(pin, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(pin, GPIO_QUAL_ASYNC);
    // Initialize I2C and its FIFO.
    I2C_disableModule(I2CA_BASE);
    I2C_initMaster(I2CA_BASE, DEVICE_SYSCLK_FREQ, I2C_A_SPEED, I2C_DUTYCYCLE_33);
    I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE); // | I2C_MASTER_RECEIVE_MODE
    I2C_setDataCount(I2CA_BASE, 2);
    I2C_setBitCount(I2CA_BASE, I2C_BITCOUNT_8);
    I2C_setAddressMode(I2CA_BASE, I2C_ADDR_MODE_10BITS);
    I2C_setSlaveAddress(I2CA_BASE, I2C_A_ADR_SLV);
    I2C_setEmulationMode(I2CA_BASE, I2C_EMULATION_FREE_RUN);

    I2C_enableFIFO(I2CA_BASE);
    I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_TXFF);
    I2C_setFIFOInterruptLevel(I2CA_BASE, I2C_FIFO_TX2, I2C_FIFO_RX2);
    I2C_enableInterrupt(I2CA_BASE, I2C_INT_TXFF | I2C_INT_STOP_CONDITION);
    I2C_enableModule(I2CA_BASE);

    Interrupt_register(INT_I2CA_FIFO, &I2C_A_FIFO_ISR);
    Interrupt_enable(INT_I2CA_FIFO);

///////////////////          SPI            /////////////////////////
    //SPI_A
    pin = 18; // CLK
    GPIO_setMasterCore(pin, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_18_SPIA_CLK);
    GPIO_setPadConfig(pin, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(pin, GPIO_QUAL_ASYNC);
    pin = 16; //SIMO
    GPIO_setMasterCore(pin, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_16_SPIA_SIMO);
    GPIO_setPadConfig(pin, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(pin, GPIO_QUAL_ASYNC);
    pin = 17; //SOMI
    GPIO_setMasterCore(pin, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_17_SPIA_SOMI);
    GPIO_setPadConfig(pin, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(pin, GPIO_QUAL_ASYNC);
    pin = 19; // STE
    GPIO_setMasterCore(pin, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_19_SPIA_STEN);
    GPIO_setPadConfig(pin, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(pin, GPIO_QUAL_ASYNC);
    //CONFIGURATION
    SPI_disableModule(SPIA_BASE);
    // SPI configuration. Use a 500kHz SPICLK and 16-bit word size.
    SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0, SPI_MODE_MASTER, SPI_A_SPEED, SPI_A_DATA_WIDTH);
    SPI_disableLoopback(SPIA_BASE);
    SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);
    // FIFO and interrupt configuration
    SPI_enableFIFO(SPIA_BASE);
    SPI_resetTxFIFO(SPIA_BASE);
    SPI_setFIFOInterruptLevel(SPIA_BASE, SPI_FIFO_TX8, SPI_FIFO_RX8);
    SPI_clearInterruptStatus(SPIA_BASE, SPI_INT_TXFF);
    SPI_enableInterrupt(SPIA_BASE, SPI_INT_TXFF);
    SPI_enableModule(SPIA_BASE);

    Interrupt_register(INT_SPIA_TX, &SPI_A_FIFO_ISR);
    Interrupt_enable(INT_SPIA_TX);
	///////////////////          WDT            /////////////////////////
    SysCtl_serviceWatchdog();
    SysCtl_disableWatchdog();
}

///////////////////          TEST SPI            /////////////////////////
volatile uint16_t spi_txMsgCount = 0;

__interrupt void SPI_A_FIFO_ISR(void){
    uint32_t i,status;

    status = SPI_getInterruptStatus(SPIA_BASE);
    i = SPI_getTxFIFOStatus(SPIA_BASE);
    SCIprintf("\r\nSPI_A_FIFO_ISR(int_sts = 0x%x,fifo_sts = 0x%x,)",status,i);

    spi_txMsgCount++;

    SPI_clearInterruptStatus(SPIA_BASE, SPI_INT_TXFF);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6);

    status = SPI_getInterruptStatus(SPIA_BASE);
    i = SPI_getTxFIFOStatus(SPIA_BASE);
    SCIprintf("\r\nSPI_A_FIFO_ISR_AFTER(int_sts = 0x%x,fifo_sts = 0x%x,)",status,i);

}

void Test_Dev_SPI(void){
    uint32_t i;
    uint16_t spi_data[2] = {0,0};

    SCIprintf("\r\nTest_Dev_SPI Start");
    while(spi_txMsgCount < 10){
        for(i = 0; i < 2; i++)  {
           SPI_writeDataNonBlocking(SPIA_BASE, spi_data[i] << (16 - SPI_A_DATA_WIDTH));
           spi_data[i]++;
        }
    }

    SCIprintf("\r\nTest_Dev_SPI End");
}

///////////////////          TEST I2C            /////////////////////////
volatile uint16_t i2c_data[2] = {0,0};
volatile uint16_t i2c_txMsgCount = 0;

__interrupt void I2C_A_FIFO_ISR(void){
    uint32_t i,status;

    status = I2C_getInterruptStatus(I2CA_BASE);
    i = I2C_getTxFIFOStatus(I2CA_BASE);
    SCIprintf("\r\nI2C_A_FIFO_ISR(int_sts = 0x%x,fifo_sts = 0x%x,)",status,i);

    i2c_txMsgCount++;

    I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_TXFF);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);

    status = I2C_getInterruptStatus(I2CA_BASE);
    i = I2C_getTxFIFOStatus(I2CA_BASE);
    SCIprintf("\r\nI2C_A_FIFO_ISR_AFTER(int_sts = 0x%x,fifo_sts = 0x%x,)",status,i);
}

void Test_Dev_I2C(void){
    uint32_t i;
    SCIprintf("\r\nTest_Dev_I2C Start");

    while(i2c_txMsgCount < 10){
        for(i = 0; i < 2; i++)   {
            I2C_putData(I2CA_BASE, i2c_data[i]);
            i2c_data[i]++;
        }
        I2C_sendStartCondition(I2CA_BASE);
    }

    SCIprintf("\r\nTest_Dev_I2C End");
}

void main(void)
{   // Initialize device clock and peripherals
    Device_init();

    // Boot CM core
#ifdef _FLASH
    Device_bootCM(BOOTMODE_BOOT_TO_FLASH_SECTOR0);
#else
    Device_bootCM(BOOTMODE_BOOT_TO_S0RAM);
#endif

    // Initialize GPIO
    Device_initGPIO();

    // Disable CPU interrupts
    DINT;

    // Initialize interrupt controller and vector table.
    Interrupt_initModule();
    Interrupt_initVectorTable();
    IER = 0x0000;
    IFR = 0x0000;

    //init interface and periphery
    Test_Dev_Init();


    EINT;
    ERTM;

    SCIprintf("\033c");
    SCIprintf("\r\n|||||||||||||||||||||||||||||||||||||||\n");

    Test_Dev_SPI();
    Test_Dev_I2C();
    Test_Dev_CAN();
    Test_Dev_LEDS();
}

 

сейчас я вижу следующее:
1. по SPI как только разрешаю все прерывания, сразу вызывается прерывание по SPI, хотя данные по SPI не передавались, при этом флаг по передаче не сбрасывается, что видно из отладочной печати:

SPI_A_FIFO_ISR(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR_AFTER(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR_AFTER(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR_AFTER(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR_AFTER(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR_AFTER(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR_AFTER(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR_AFTER(int_sts = 0x8,fifo_sts = 0x0,)
SPI_A_FIFO_ISR(int_sts = 0x8,fifo_sts = 0x0

2. если прерывания и тест по SPI запретить, а только вкл тест по I2C, то так же сразу вызывается прерывание по I2C, хотя данные по I2C не передавались, при этом флаг по передаче не сбрасывается, что видно из отладочной печати:

I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR_AFTER(int_sts = 0x20010,fifo_sts = 0x0,)
I2C_A_FIFO_ISR(int_sts = 0x20010,fifo_sts = 0x0

3. по CAN тоже странно отрабатывают прерывания, но я хотел бы сейчас хотя бы разобраться с первыми 2мя пунктами

4. микгание светодиодов отрабатывает корректно

как видно по I2C и SPI ситуация очень схожая по отработке прерывания, вероятнее всего дело в настройке самих прерываний, но я пересмотрел там и там, все по примерам сделал верно, да и сами примеры ведут себя так же

прошу посмотреть инициализацию, может у вас будут какие идеи, я уже пересмотрел кучу примеров от TI, на github, я не увидел, в чем может быть причина отработки таким образом прерываний по SPI и I2C

Также хочу обратить внимание, что питание модуля осуществляется через внешний источник питания +5В, 1,2А, т.е. тока должно хватить

спасибо, жду вашего ответа

pmu_m_cpu1.zip

Изменено пользователем xxxmatrixxx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CAN так не работает (аппаратное подключение), почитайте спецификацию.

С многоядерными не работал, только 28335 и picсolo некоторые, тут нету особенности запуска ядер и расстановки их приоритетов?

Надо бы доки почитать а не примеры, в примерах бывает не все пишут, т.к. в примере и так работает.

Изменено пользователем ELEKTROS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, ELEKTROS said:

CAN так не работает (аппаратное подключение), почитайте спецификацию.

 

перечитал, спасибо, буду ставить внешнюю физику на CAN и проверять

 

а что с I2C и SPI, сейчас они у меня никуда не подключены и выплевывают пакеты наружу, смотрю их наличие осцилографом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас в комментариях не ошибка случайно, длина 8 бит передачи по SPI помоему (параметр SPI_A_DATA_WIDTH), а написано 16?

У меня были похожие приколы с прерываниями, но было это лет 6 назад и дело было в не сбросе каких то флагов, подробностей не помню уже и не факт что это ваш случай.

так а до функций

 Test_Dev_SPI();
    Test_Dev_I2C();
    Test_Dev_CAN();
    Test_Dev_LEDS();

доходит вообще или после разрешения прерываний в них и остаётся?

Еще если FIFO режим используете, там еще где то флаги должны ставиться касательно этого режима (их нужно ручками сбрасывать), в другом регистре (это по 28335, но тут наверное та же архитектура модуля).

Изменено пользователем ELEKTROS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, ELEKTROS said:

У вас в комментариях не ошибка случайно, длина 8 бит передачи по SPI помоему (параметр SPI_A_DATA_WIDTH), а написано 16?

У меня были похожие приколы с прерываниями, но было это лет 6 назад и дело было в не сбросе каких то флагов, подробностей не помню уже и не факт что это ваш случай.

так а до функций


 Test_Dev_SPI();
    Test_Dev_I2C();
    Test_Dev_CAN();
    Test_Dev_LEDS();

доходит вообще или после разрешения прерываний в них и остаётся?

 

там биты выталкиваются от старшего к младшему, т.е. если я пишу uint8_t, то я должен сдвинуть их на 8 разрядов влево

#define SPI_A_DATA_WIDTH               8

вот и выходит SPI_writeDataNonBlocking(SPIA_BASE, spi_data << (16 - SPI_A_DATA_WIDTH));

 Test_Dev_SPI();
    Test_Dev_I2C();
    Test_Dev_CAN();
    Test_Dev_LEDS();

у меня до этих функций вообще не доходит, сразу начинает отрабатывать прерывание постоянно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, xxxmatrixxx said:

там биты выталкиваются от старшего к младшему, т.е. если я пишу uint8_t, то я должен сдвинуть их на 8 разрядов влево

#define SPI_A_DATA_WIDTH               8

вот и выходит SPI_writeDataNonBlocking(SPIA_BASE, spi_data << (16 - SPI_A_DATA_WIDTH));

 

Я это знаю, но передача в этом случае по 8 бит, а в комментариях выше написано 16.

Предыдущее сообщение в конце немного добавил.

Изменено пользователем ELEKTROS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, ELEKTROS said:

Я это знаю, но передача в этом случае по 8 бит, а в комментариях выше написано 16.

у меня в любом случае до передачи реальных данных не доходит, сразу после глобального разрешения всех прерываний, постоянно попадаю в обработчик TX по SPI

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите регистр: SPIFFTX, там те флаги сидят что я писал.

Или попробуйте пока без FIFO режима. У меня без прерываний используется, удобно по сравнению с классикой задержек на ожидание tx/rx в фоне.

Изменено пользователем ELEKTROS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...