Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DAVE XMC1200 вопрос о работе с MANCHESTER_SW
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Илья_26
Люди добрые, помогите разобраться.
Очень надеюсь что кто-нибудь из Вас работал с Infineon контроллерами. У меня же в наличии XMC1200 контроллер.
Так вот вопрос по программированию периферии данного контроллера:

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

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

CODE
#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;

}

}
Илья_26
Так, стабильно получать и обрабатывать данные вроде получилось, но посылки MANCHESTER_SW все равно бесконечные... krapula.gif
Код
...
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;
...


Илья_26
так, по моему не там я проблему ищу, а надо ее искать непосредственно в UART fman.gif . Дело в том что:
Код
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.gif
jcxz
Цитата(Илья_26 @ Apr 24 2017, 08:07) *
Очень надеюсь что кто-нибудь из Вас работал с Infineon контроллерами. У меня же в наличии XMC1200 контроллер.

Работал и работаю. Вот только ни MANCHESTER_SW ни даже UART в моём Infineon нет. laughing.gif
У Вас вопрос очень специфический - тут мало кто работает с Infineon вообще, Вашим семейством в частности, а Вам ещё и конкретная периферия нужна вашего конкретного Infineon, да ещё собственно не сама периферия - а какие-то библиотечные функции некоей библиотеки....
Лучше обратиться на https://www.infineonforums.com/ - вполне себе живой форум где отвечают.
Илья_26
да я 3 раза пытался задать там вопрос, и натыкался на банер "как только наш админ модератор одобрит мы разместим". Если честно, форум infineona очень медленный, не в какое сравнение с этим или скажем с форумом Миландра, но к сожалению приходится работать с infineon-ом и их УЖАСНОЙ библиотекой периферии. Вся эта затея с обменом по УАРТ и передачей далее через MANCHIESTER из-за банального отсутствия, а вернее сказать обмана производителя maniac.gif в наличии готовой "DALI" библиотеки. Ее просто нет, а MANCHIESTER - это та штука на основе которой в 3 ветки DAVE-а была написана эта самая библиотека.

По этому пытаюсь написать ее с нуля, а взаимодействие с UART нужно для отработки да и мастер управления DALI все равно нужен. twak.gif
jcxz
Цитата(Илья_26 @ Apr 24 2017, 13:07) *
да я 3 раза пытался задать там вопрос, и натыкался на банер "как только наш админ модератор одобрит мы разместим". Если честно, форум infineona очень медленный,

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

Цитата(Илья_26 @ Apr 24 2017, 13:07) *
приходится работать с infineon-ом и их УЖАСНОЙ библиотекой периферии.

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

Заставляет работодатель, а в мануале примеры под 3 DAVE, сейчас DAVE 4, и как достать 3 ветку легально я не знаю (борьба с пиратством, так сказать)... по этому примеры отпадают хоть и не полностью, но многое приходится додумывать самому. Так же в ответ про мануал: в юзер-мануле ни строчки не сказано о такой загадочной "вещицы" как MANCHIESTER. О этой "вещицы", которая является основой для надстройки к DALI, DMX512..., я узнал только благодаря глубокому ковырянию кодов и примеров для DAVE 3, который, как было сказано ранее, структурно и функционально (написанный код структур и функций) различаются. Нет, несомненно есть общие точки соприкосновения, но далеко не все ясно.
И да
Цитата
Ответ получил через 2 дня
, я бы тоже подождал, если бы вопрос хотя бы опубликовали, а то ждите рассмотрения "Администрации форума" на публикацию. Ейбогу как флудеру какому-то. Ладно, это все лирика... от темы отошли, пойду дальше UART ковырять wacko.gif
oleg_d
Цитата(Илья_26 @ Apr 24 2017, 16:08) *
и как достать 3 ветку легально я не знаю (борьба с пиратством, так сказать)

Просто регистрируйтесь и качайте.
https://www.infineon.com/cms/en/product/pro...3_Download.html
редактор
Не работал с этим МК, но по опыту работы с другими, предположу, что нужно перед чтением данных проверять флаг приема. Его по любому можно сбросить (защита от повторного чтения).
А вычитывать содержимое регистр - идеологически неправильно.Функция что-то да вернет.Ну если только внутри функции не реализована проверка флага приема. Но это уже тонкости библиотеки.
Obam
Заинтересовали прямо: глянул в xmc1200_rm_v1_0_2013_03.pdf - обычный УАПП, ну ладно, длина данных до 63 бит. "Манчестер"? - букв в таком порядке там нет даже. УАППу зачем "разбавлять" длинные последовательности ноликов или единичек?
Илья_26
Цитата
Не работал с этим МК, но по опыту работы с другими, предположу, что нужно перед чтением данных проверять флаг приема. Его по любому можно сбросить (защита от повторного чтения).
А вычитывать содержимое регистр - идеологически неправильно.


Благодарю за ценную мысль, пересмотрел взгляды на задачу и все получилось! 08.gif Ниже фрагмент кода, если вдруг кому понадобиться:
Код
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.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.