xxxmatrixxx 0 3 сентября, 2020 Опубликовано 3 сентября, 2020 (изменено) · Жалоба Здравствуйте, уважаемые форумчане!!! мы приобрели следующий набор отладочных плат: 1. HSEC180 controlCARD Baseboard Docking Stationhttps://www.ti.com/tool/TMDSHSECDOCKhttps://efind.ru/offer/TMDSHSECDOCK 2. F28388D controlCARD evaluation modulehttps://www.ti.com/tool/TMDSCNCD28388Dhttps://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 Изменено 3 сентября, 2020 пользователем xxxmatrixxx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ELEKTROS 0 3 сентября, 2020 Опубликовано 3 сентября, 2020 (изменено) · Жалоба CAN так не работает (аппаратное подключение), почитайте спецификацию. С многоядерными не работал, только 28335 и picсolo некоторые, тут нету особенности запуска ядер и расстановки их приоритетов? Надо бы доки почитать а не примеры, в примерах бывает не все пишут, т.к. в примере и так работает. Изменено 3 сентября, 2020 пользователем ELEKTROS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xxxmatrixxx 0 3 сентября, 2020 Опубликовано 3 сентября, 2020 · Жалоба 19 minutes ago, ELEKTROS said: CAN так не работает (аппаратное подключение), почитайте спецификацию. перечитал, спасибо, буду ставить внешнюю физику на CAN и проверять а что с I2C и SPI, сейчас они у меня никуда не подключены и выплевывают пакеты наружу, смотрю их наличие осцилографом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ELEKTROS 0 3 сентября, 2020 Опубликовано 3 сентября, 2020 (изменено) · Жалоба У вас в комментариях не ошибка случайно, длина 8 бит передачи по SPI помоему (параметр SPI_A_DATA_WIDTH), а написано 16? У меня были похожие приколы с прерываниями, но было это лет 6 назад и дело было в не сбросе каких то флагов, подробностей не помню уже и не факт что это ваш случай. так а до функций Test_Dev_SPI(); Test_Dev_I2C(); Test_Dev_CAN(); Test_Dev_LEDS(); доходит вообще или после разрешения прерываний в них и остаётся? Еще если FIFO режим используете, там еще где то флаги должны ставиться касательно этого режима (их нужно ручками сбрасывать), в другом регистре (это по 28335, но тут наверное та же архитектура модуля). Изменено 3 сентября, 2020 пользователем ELEKTROS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xxxmatrixxx 0 3 сентября, 2020 Опубликовано 3 сентября, 2020 · Жалоба 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(); у меня до этих функций вообще не доходит, сразу начинает отрабатывать прерывание постоянно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ELEKTROS 0 3 сентября, 2020 Опубликовано 3 сентября, 2020 (изменено) · Жалоба 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. Предыдущее сообщение в конце немного добавил. Изменено 3 сентября, 2020 пользователем ELEKTROS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xxxmatrixxx 0 3 сентября, 2020 Опубликовано 3 сентября, 2020 · Жалоба 1 minute ago, ELEKTROS said: Я это знаю, но передача в этом случае по 8 бит, а в комментариях выше написано 16. у меня в любом случае до передачи реальных данных не доходит, сразу после глобального разрешения всех прерываний, постоянно попадаю в обработчик TX по SPI Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ELEKTROS 0 3 сентября, 2020 Опубликовано 3 сентября, 2020 (изменено) · Жалоба Посмотрите регистр: SPIFFTX, там те флаги сидят что я писал. Или попробуйте пока без FIFO режима. У меня без прерываний используется, удобно по сравнению с классикой задержек на ожидание tx/rx в фоне. Изменено 3 сентября, 2020 пользователем ELEKTROS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ELEKTROS 0 14 января, 2021 Опубликовано 14 января, 2021 · Жалоба Так в итоге как победили или не победили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться