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

DAVE XMC1200 вопрос о работе с MANCHESTER_SW

Люди добрые, помогите разобраться.

Очень надеюсь что кто-нибудь из Вас работал с Infineon контроллерами. У меня же в наличии XMC1200 контроллер.

Так вот вопрос по программированию периферии данного контроллера:

 

Как сделать что бы MANCHESTER_SW_0 отправлял одну посылку данных по приему с UART данных, например 0х01?

 

В нижеприведенном коде посылка отправляется постоянно, при повторной посылки по UART команды 0х01, MANCHESTER_SW_0 перестает пересылать и вообще реагировать "на внешний раздражитель" UART.

 

#include <DAVE.h>				 //Declarations from DAVE Code Generation (includes SFR declaration)
#include <xmc_uart.h>

#define UART_RX P1_3
#define UART_TX P1_2

uint16_t ReceiveData = 0;

/* Pins configuration */
XMC_GPIO_CONFIG_t uart_tx;
XMC_GPIO_CONFIG_t uart_rx;

/* UART configuration */
const XMC_UART_CH_CONFIG_t uart_config =
{
 .data_bits = 8U,
 .stop_bits = 1U,
 .baudrate = 9600
};

/**

* @brief main() - Application entry point
*
* <b>Details of function</b><br>
* This routine is the application entry point. It is invoked by the device startup code. It is responsible for
* invoking the APP initialization dispatcher routine - DAVE_Init() and hosting the place-holder for user application
* code.
*/

int main(void)
{
 DAVE_STATUS_t status;


 status = DAVE_Init();		   /* Initialization of DAVE APPs  */

 uart_tx.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT7;
 uart_rx.mode = XMC_GPIO_MODE_INPUT_TRISTATE;
 //led.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL;

/* Configure UART channel */
 XMC_UART_CH_Init(XMC_UART0_CH1, &uart_config);
 XMC_UART_CH_SetInputSource(XMC_UART0_CH1, XMC_UART_CH_INPUT_RXD,USIC0_C1_DX0_P1_3);

  /* Start UART channel */
 XMC_UART_CH_Start(XMC_UART0_CH1);

/* Configure pins */
 XMC_GPIO_Init(UART_TX, &uart_tx);
 XMC_GPIO_Init(UART_RX, &uart_rx);

 //NVIC_SetPriority(USIC0_1_IRQn,3U);
 //NVIC_EnableIRQ(USIC0_1_IRQn);

 if(status != DAVE_STATUS_SUCCESS)
 {
/* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */
XMC_DEBUG("DAVE APPs initialization failed\n");

while(1U)
{

}
 }
 /* Placeholder for user application code. The while loop below can be replaced with user application code. */
uint32_t temp1 = 0;
 while(1U)
 {
		  ReceiveData = XMC_UART_CH_GetReceivedData(XMC_UART0_CH1);

		  if(ReceiveData == 1){
			  MANCHESTER_SW_0.encoder->data = ReceiveData;
			  MANCHESTER_SW_Encode(&MANCHESTER_SW_0);
			  temp1 = MANCHESTER_SW_0.encoder->status;
			  while(MANCHESTER_SW_0.encoder->status != 1);
		  }
			  ReceiveData = 0;
			  XMC_UART_CH_Transmit(XMC_UART0_CH1, ReceiveData);
			  ReceiveData = 0;

 }

}

Изменено пользователем IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

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


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

Так, стабильно получать и обрабатывать данные вроде получилось, но посылки MANCHESTER_SW все равно бесконечные... :krapula:

...
ReceiveData = XMC_UART_CH_GetReceivedData(XMC_UART0_CH1);
if(ReceiveData == 0x0001){
MANCHESTER_SW_0.encoder->status = 0U;              //<--добавил обновление статуса, как оказалось после прохождения while(MANCHESTER_SW_0.encoder->status != 1); статус оставался 1
MANCHESTER_SW_0.encoder->data = ReceiveData;
MANCHESTER_SW_Encode(&MANCHESTER_SW_0);
temp1 = MANCHESTER_SW_0.encoder->status;
while(MANCHESTER_SW_0.encoder->status != 1);
}
ReceiveData = 0;
XMC_UART_CH_Transmit(XMC_UART0_CH1, ReceiveData);
ReceiveData = 0;
...

13686597.jpg

13677381.jpg

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


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

так, по моему не там я проблему ищу, а надо ее искать непосредственно в UART :fman: . Дело в том что:

ReceiveData = XMC_UART_CH_GetReceivedData(XMC_UART0_CH1);

данной строчкой мы читаем пришедшее по UART всяку бяку данные и вот не задача:

while(1){
ReceiveData = XMC_UART_CH_GetReceivedData(XMC_UART0_CH1);
if(ReceiveData == 0x01){

MANCHESTER_SW_0.encoder->status = 0U;
MANCHESTER_SW_0.encoder->data = ReceiveData;
                  
MANCHESTER_SW_Encode(&MANCHESTER_SW_0);
temp1 = MANCHESTER_SW_0.encoder->status;
while(MANCHESTER_SW_0.encoder->status != 1);
ReceiveData = 0xFF;
XMC_UART_CH_Transmit(XMC_UART0_CH1, ReceiveData);
     }
}

как только код проходит первый цыкал и возвращается к строчки

ReceiveData = XMC_UART_CH_GetReceivedData(XMC_UART0_CH1);

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

Следовательно его как-то надо очищать!

Чтож, продолжу свои изыскания, будут мысли как почистить UART RX пишите, не стесняйтесь. Буду рад любой помощи! :smile3046:

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


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

Очень надеюсь что кто-нибудь из Вас работал с Infineon контроллерами. У меня же в наличии XMC1200 контроллер.

Работал и работаю. Вот только ни MANCHESTER_SW ни даже UART в моём Infineon нет. :laughing:

У Вас вопрос очень специфический - тут мало кто работает с Infineon вообще, Вашим семейством в частности, а Вам ещё и конкретная периферия нужна вашего конкретного Infineon, да ещё собственно не сама периферия - а какие-то библиотечные функции некоей библиотеки....

Лучше обратиться на https://www.infineonforums.com/ - вполне себе живой форум где отвечают.

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


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

да я 3 раза пытался задать там вопрос, и натыкался на банер "как только наш админ модератор одобрит мы разместим". Если честно, форум infineona очень медленный, не в какое сравнение с этим или скажем с форумом Миландра, но к сожалению приходится работать с infineon-ом и их УЖАСНОЙ библиотекой периферии. Вся эта затея с обменом по УАРТ и передачей далее через MANCHIESTER из-за банального отсутствия, а вернее сказать обмана производителя :maniac: в наличии готовой "DALI" библиотеки. Ее просто нет, а MANCHIESTER - это та штука на основе которой в 3 ветки DAVE-а была написана эта самая библиотека.

 

По этому пытаюсь написать ее с нуля, а взаимодействие с UART нужно для отработки да и мастер управления DALI все равно нужен. :twak:

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


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

да я 3 раза пытался задать там вопрос, и натыкался на банер "как только наш админ модератор одобрит мы разместим". Если честно, форум infineona очень медленный,

Я там один раз вопрос задавал. Ответ получил через 2 дня. Считаю это недолго. Тем более ответ - квалифицированный.

 

приходится работать с infineon-ом и их УЖАСНОЙ библиотекой периферии.

Кто-ж Вас заставляет??? Есть же юзермануал на контроллер. Я по нему всю работу с периферией и написал. Один раз только пришлось в примеры смотреть, да ещё раз - на их форуме спросить (да и то лишь - для подтверждения того, что я и так уже понял из мануала).

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


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

Кто-ж Вас заставляет???

Заставляет работодатель, а в мануале примеры под 3 DAVE, сейчас DAVE 4, и как достать 3 ветку легально я не знаю (борьба с пиратством, так сказать)... по этому примеры отпадают хоть и не полностью, но многое приходится додумывать самому. Так же в ответ про мануал: в юзер-мануле ни строчки не сказано о такой загадочной "вещицы" как MANCHIESTER. О этой "вещицы", которая является основой для надстройки к DALI, DMX512..., я узнал только благодаря глубокому ковырянию кодов и примеров для DAVE 3, который, как было сказано ранее, структурно и функционально (написанный код структур и функций) различаются. Нет, несомненно есть общие точки соприкосновения, но далеко не все ясно.

И да

Ответ получил через 2 дня
, я бы тоже подождал, если бы вопрос хотя бы опубликовали, а то ждите рассмотрения "Администрации форума" на публикацию. Ейбогу как флудеру какому-то. Ладно, это все лирика... от темы отошли, пойду дальше UART ковырять :wacko:
Изменено пользователем Илья_26

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


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

и как достать 3 ветку легально я не знаю (борьба с пиратством, так сказать)

Просто регистрируйтесь и качайте.

https://www.infineon.com/cms/en/product/pro...3_Download.html

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


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

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

А вычитывать содержимое регистр - идеологически неправильно.Функция что-то да вернет.Ну если только внутри функции не реализована проверка флага приема. Но это уже тонкости библиотеки.

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


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

Заинтересовали прямо: глянул в xmc1200_rm_v1_0_2013_03.pdf - обычный УАПП, ну ладно, длина данных до 63 бит. "Манчестер"? - букв в таком порядке там нет даже. УАППу зачем "разбавлять" длинные последовательности ноликов или единичек?

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


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

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

А вычитывать содержимое регистр - идеологически неправильно.

 

Благодарю за ценную мысль, пересмотрел взгляды на задачу и все получилось! :08: Ниже фрагмент кода, если вдруг кому понадобиться:

if(XMC_UART_CH_GetStatusFlag(XMC_UART0_CH1) & XMC_UART_CH_STATUS_FLAG_RECEIVER_START_INDICATION)
{
  ReceiveData = XMC_UART_CH_GetReceivedData(XMC_UART0_CH1);
  while(!XMC_UART_CH_STATUS_FLAG_RECEIVE_FRAME_FINISHED);
  XMC_UART_CH_ClearStatusFlag(XMC_UART0_CH1, XMC_UART_CH_STATUS_FLAG_RECEIVER_START_INDICATION);
}
if(ReceiveData == 0x01){
  MANCHESTER_SW_0.encoder->status = 0U;
  MANCHESTER_SW_0.encoder->data = ReceiveData;

  MANCHESTER_SW_Encode(&MANCHESTER_SW_0);
  temp1 = MANCHESTER_SW_0.encoder->status;
  while(MANCHESTER_SW_0.encoder->status != 1);
  ReceiveData = 0xFF;
  XMC_UART_CH_Transmit(XMC_UART0_CH1, ReceiveData);
}

"Манчестер"? - букв в таком порядке там нет даже.

Повторюсь, использую библиотеку XMC. Конечно, каждый "развлекается" как хочет, но меня совершенно не улыбает штудировать юзер манул и использовать предложенную мнемонику, вместо человеческого языка предложенного производителем в их библиотеке (хотя и есть у меня к ним притенении). Хотя Вы правы, в мануале действительно ни чего подобного как MANCHESTER_SW нет.

MANCHESTER_SW - это, я так понял основа для надстройки DALI, DMX512,SPI...

Вот что пишет об этом элементе сам производитель:

MANCHESTER_SW APP provides software stack to perform data encoding and decoding techniques. And it provides a user configuration for manchester codec. MANCHESTER_SW APP supports following features:

1. Supports encoder feature using two different methods: ◦

Using GPIO & SYSTIMER ◦ Using SPI functionality

 

2. Supports decoder feature using capture functionality.

3. G. E. Thomas and IEEE 802.3 convention formats are supported for representing the data.

4. Supports user notification via user callback registration using callback function CheckPacket() for following scenarios: ◦ Successful Reception: Indicates manchester decoder operation is successful.

◦ Frame Error: Indicates invalid frame may be due to start or stop bits are missing or invalid manchester frame format (i.e. 3 consecutive bits of 1's or 0's / number of received bits are not equal to number of decode bits).

◦ Bit rate error: Indicates bit rate mismatch (i.e. received frame/bits not in allowable minimum and maximum tolerance range ).

Note: Error notification via callback is notified only when error notification check is enabled in GUI.

5. Provides run time API MANCHESTER_SW_Encode() to transmit the data, data structure for storing status flag and to hold transmit/decoded data.

6. Support of Frame Error and Bit Rate Error detection.

7. Support of various Data Bit Rate Tolerance from 5 to 50%.

8. Support of stop bits configuration from 0 to 2 bits.

9. Used for DALI, RF and IR protocols.

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


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

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

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

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

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

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

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

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

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

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