Jump to content
    

Приветствую.

Может кто пользовался и может подсказать. Есть проблема с приёмом сообщений от AXI CAN. Как понимаю какая-то ошибка с таймингами.

В двух проектах используются ядра Xilinx AXI CAN. В одном всё классно работает, в другом - теряется половина сообщения. Для нерабочего проекта попробовал убрать всё и оставить в системе толко AXI CAN. В данном случае приём наладился. Посмотрел, каким образом расположена логика для AXI CAN, и попробовал привязать её таким же образом с помощью create_pblock для полной версии проекта. Не помогло.

Screenshot from 2019-10-26 09-36-47.png

Screenshot from 2019-10-26 10-18-19.png

На втором рисунке битое сообщение .

Share this post


Link to post
Share on other sites

Запустил на своём железе пример Xilinx, функция XCan_SelfTest использующая loopback mode не проходит (потерян тот же кусок пакета)

Screenshot from 2019-10-26 14-42-25.png

Share this post


Link to post
Share on other sites

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-шину либо одну либо две транзакции чтения (как результат приёмное фифо ядра теряет данные).

Откуда берётся вторая транзакция чтения?

Share this post


Link to post
Share on other sites

У меня была подобная ошибка, правда у меня случался пропуск значением с копированием значений из предыдущего такта. Хорошо, что это был проект для тестирования и читалось с RAM, поэтому я логически обошёл эту проблему. В вашем случае даже не предствавляю как можно вырулить.

Share this post


Link to post
Share on other sites

Остановился на breakpoint-е и жму F6, ILA в сечении AXI Interconnect/AXI CAN ловит две транзакции чтения

Screenshot from 2019-10-29 17-22-22.png

Screenshot from 2019-10-29 17-22-17.png

Share this post


Link to post
Share on other sites

28 minutes ago, doom13 said:

Остановился на breakpoint-е и жму F6, ILA в сечении AXI Interconnect/AXI CAN ловит две транзакции чтения

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

Share this post


Link to post
Share on other sites

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);  // Две транзакции на шине

Уже начинаю думать, что так и надо)

Share this post


Link to post
Share on other sites

4 minutes ago, doom13 said:

Это как?

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

Share this post


Link to post
Share on other sites

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();

Т.е. кеши вроде ни при чём?

Share this post


Link to post
Share on other sites

37 minutes ago, doom13 said:

Они разные и адрес второй транзакции соответствует тому, что должна читать


/* Read DLC */
	rx_frame[1] = XCan_ReadReg(xcan.BaseAddress, XCAN_RXFIFO_DLC_OFFSET);

которая ещё не выполнялась

это конечно врядли, но шина может расщепить транзакцию на две, если она не выровнена по границам слова. может быть у вас где-то к адресу слова прибавляется смещение на 1/2/3 байта?

Share this post


Link to post
Share on other sites

На этом же железе попробовал чистый проект для 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

Share this post


Link to post
Share on other sites

Так вот где собака зарыта! Скорее всего неправильное CDC. Посмотрите синхронно ли у вас работают оба генератора (для ядра и для логики). Я давеча на те же грабли наскочил. Если фазы у сигналов выровнены - тогда проблем не должно быть, но если они генерируются как душе угодно... Тогда результаты могут быть поразительные) Ну и схему перехода клоков нужно посмотреть)

Share this post


Link to post
Share on other sites

6 hours ago, Nick_K said:

Скорее всего неправильное CDC. Посмотрите синхронно ли у вас работают оба генератора (для ядра и для логики).

Bсе тактовые с одного MMCM (MicroBlaze, AXI CAN).

6 hours ago, Nick_K said:

Ну и схему перехода клоков нужно посмотреть)

AXI interconnect всё сделал автоматом

Share this post


Link to post
Share on other sites

9 minutes ago, doom13 said:

Bсе тактовые с одного MMCM (MicroBlaze, AXI CAN)

С одного генератора, ещё не показатель синхронности. Очень важный параметр при генерации - включить регулирование фаз и в таблице фазировок задать сдвиг фаз 0 градусов. Если таблица серая, значит фазы буду получены как попало.

Screenshot_20191030_151735.thumb.png.f0b35971839cf3729979a1e4a243e308.pngScreenshot_20191030_151939.thumb.png.f6e226269b1dd4109777c17d04ccb8e5.png

9 minutes ago, doom13 said:

AXI interconnect всё сделал автоматом

Что сделал? Схему согласования что-ли? Логика должна быть определённая

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...