doom13 0 October 26, 2019 Posted October 26, 2019 · Report post Приветствую. Может кто пользовался и может подсказать. Есть проблема с приёмом сообщений от AXI CAN. Как понимаю какая-то ошибка с таймингами. В двух проектах используются ядра Xilinx AXI CAN. В одном всё классно работает, в другом - теряется половина сообщения. Для нерабочего проекта попробовал убрать всё и оставить в системе толко AXI CAN. В данном случае приём наладился. Посмотрел, каким образом расположена логика для AXI CAN, и попробовал привязать её таким же образом с помощью create_pblock для полной версии проекта. Не помогло. На втором рисунке битое сообщение . Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 October 26, 2019 Posted October 26, 2019 · Report post Запустил на своём железе пример Xilinx, функция XCan_SelfTest использующая loopback mode не проходит (потерян тот же кусок пакета) Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 October 29, 2019 Posted October 29, 2019 · Report post uint32_t canreg; canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_SRR_OFFSET); canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_MSR_OFFSET); canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_BRPR_OFFSET); canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_BTR_OFFSET); canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_ECR_OFFSET); При исполнении данного кода на каждую Xil_In32 MicroBlaze выставляет на AXI-шину либо одну либо две транзакции чтения (как результат приёмное фифо ядра теряет данные). Откуда берётся вторая транзакция чтения? Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 October 29, 2019 Posted October 29, 2019 · Report post У меня была подобная ошибка, правда у меня случался пропуск значением с копированием значений из предыдущего такта. Хорошо, что это был проект для тестирования и читалось с RAM, поэтому я логически обошёл эту проблему. В вашем случае даже не предствавляю как можно вырулить. Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 October 29, 2019 Posted October 29, 2019 · Report post Остановился на breakpoint-е и жму F6, ILA в сечении AXI Interconnect/AXI CAN ловит две транзакции чтения Quote Share this post Link to post Share on other sites More sharing options...
des00 27 October 29, 2019 Posted October 29, 2019 · Report post 28 minutes ago, doom13 said: Остановился на breakpoint-е и жму F6, ILA в сечении AXI Interconnect/AXI CAN ловит две транзакции чтения ну адреса разные, может у вас где то собираются транзакции и отправляются пачкой? Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 October 29, 2019 Posted October 29, 2019 · Report post 4 minutes ago, des00 said: ну адреса разные, может у вас где то собираются транзакции и отправляются пачкой? Это как? После того, как нашёл эту ошибку с чтением фифо для AXI CAN, пробую просто почитать регистры ядра: uint32_t canreg; canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_SRR_OFFSET); // Две транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_MSR_OFFSET); // Одна транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_BRPR_OFFSET); // Две транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_BTR_OFFSET); // Одна транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_ECR_OFFSET); // Две транзакции на шине Уже начинаю думать, что так и надо) Quote Share this post Link to post Share on other sites More sharing options...
des00 27 October 29, 2019 Posted October 29, 2019 · Report post 4 minutes ago, doom13 said: Это как? ну может в кеше команды копятся, а потом пачкой на акси. но на вейвформе видно что транзакии разные, по адресам 20 и 21. была бы одна команда с одинаковым адресом, тогда был бы глюк, а так...где то запускается "пакетное" чтение Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 October 29, 2019 Posted October 29, 2019 · Report post 9 minutes ago, des00 said: ну адреса разные Они разные и адрес второй транзакции соответствует тому, что должна читать /* Read DLC */ rx_frame[1] = XCan_ReadReg(xcan.BaseAddress, XCAN_RXFIFO_DLC_OFFSET); которая ещё не выполнялась 6 minutes ago, des00 said: ну может в кеше команды копятся Instruction/Data caches в настройках для MicroBlaze выключены, но ещё попробовал поставить перед чтением регистров AXI CAN microblaze_invalidate_icache(); microblaze_invalidate_dcache(); microblaze_disable_icache(); microblaze_disable_dcache(); Т.е. кеши вроде ни при чём? Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 October 29, 2019 Posted October 29, 2019 · Report post Адреса системы, может проблема где-то тут? Quote Share this post Link to post Share on other sites More sharing options...
des00 27 October 29, 2019 Posted October 29, 2019 · Report post 37 minutes ago, doom13 said: Они разные и адрес второй транзакции соответствует тому, что должна читать /* Read DLC */ rx_frame[1] = XCan_ReadReg(xcan.BaseAddress, XCAN_RXFIFO_DLC_OFFSET); которая ещё не выполнялась это конечно врядли, но шина может расщепить транзакцию на две, если она не выровнена по границам слова. может быть у вас где-то к адресу слова прибавляется смещение на 1/2/3 байта? Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 October 29, 2019 Posted October 29, 2019 · Report post На этом же железе попробовал чистый проект для MicroBlaze запустить #include "xparameters.h" #include "xcan_l.h" #include "xil_io.h" int main() { int canreg; canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_SRR_OFFSET); // Две транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_MSR_OFFSET); // Одна транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_BRPR_OFFSET); // Две транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_BTR_OFFSET); // Одна транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_ECR_OFFSET); // Две транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_ESR_OFFSET); // Одна транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_SR_OFFSET); // Две транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_ISR_OFFSET); // Одна транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_IER_OFFSET); // Две транзакции на шине canreg = Xil_In32(XPAR_CAN_1_BASEADDR + XCAN_ICR_OFFSET); // Одна транзакции на шине return 0; } Похоже железо глючит? Есть переход с 200 МГц на 100МГц (процессор на 200 МГц работает, AXI CAN на 100 МГц, т.к. в доке вычитал, что 200 он не тянет) #define XCAN_SRR_OFFSET 0x000 /**< Software Reset Register */ #define XCAN_MSR_OFFSET 0x004 /**< Mode Select Register */ #define XCAN_BRPR_OFFSET 0x008 /**< Baud Rate Prescaler Register */ #define XCAN_BTR_OFFSET 0x00C /**< Bit Timing Register */ #define XCAN_ECR_OFFSET 0x010 /**< Error Counter Register */ #define XCAN_ESR_OFFSET 0x014 /**< Error Status Register */ #define XCAN_SR_OFFSET 0x018 /**< Status Register */ #define XCAN_ISR_OFFSET 0x01C /**< Interrupt Status Register */ #define XCAN_IER_OFFSET 0x020 /**< Interrupt Enable Register */ #define XCAN_ICR_OFFSET 0x024 /**< Interrupt Clear Register */ #define XPAR_CAN_1_BASEADDR 0x44AA0000 Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 October 30, 2019 Posted October 30, 2019 · Report post Так вот где собака зарыта! Скорее всего неправильное CDC. Посмотрите синхронно ли у вас работают оба генератора (для ядра и для логики). Я давеча на те же грабли наскочил. Если фазы у сигналов выровнены - тогда проблем не должно быть, но если они генерируются как душе угодно... Тогда результаты могут быть поразительные) Ну и схему перехода клоков нужно посмотреть) Quote Share this post Link to post Share on other sites More sharing options...
doom13 0 October 30, 2019 Posted October 30, 2019 · Report post 6 hours ago, Nick_K said: Скорее всего неправильное CDC. Посмотрите синхронно ли у вас работают оба генератора (для ядра и для логики). Bсе тактовые с одного MMCM (MicroBlaze, AXI CAN). 6 hours ago, Nick_K said: Ну и схему перехода клоков нужно посмотреть) AXI interconnect всё сделал автоматом Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 October 30, 2019 Posted October 30, 2019 · Report post 9 minutes ago, doom13 said: Bсе тактовые с одного MMCM (MicroBlaze, AXI CAN) С одного генератора, ещё не показатель синхронности. Очень важный параметр при генерации - включить регулирование фаз и в таблице фазировок задать сдвиг фаз 0 градусов. Если таблица серая, значит фазы буду получены как попало. 9 minutes ago, doom13 said: AXI interconnect всё сделал автоматом Что сделал? Схему согласования что-ли? Логика должна быть определённая Quote Share this post Link to post Share on other sites More sharing options...