Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с протоколом WAKE.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ЛЕСЯ
Разрабатываю устройство для управления бесколлекторным двигателем. Для организации обмена данными и командами управления хочу использовать протокол WAKE. Есть исходники и описание протокола для РС и AVR. Вот только никак не могу въехать в исходный файл для AVR. Поделитесь опытом если кто уже сталкивался с подобной проблемой.
BlackJack
Я разбирался.
В конце концов написал свой обработчик на С, работает уже давно.
Не думаю, что он проще. Тоже надо въезжать.
Пишите на С сами, ничего военного.
Вот комменты к моей проге

прием синхронизируется по старт байту FEND
Следующий за стартовым байт -длина фрейма без учета байт-стаффинга и
контрольной суммы. Байт стаффинг делается на лету. Контрольная сумма
вычисляется тут же и если соответствует, то вызывается
CallBack с errorlevel=CRC_OK, иначе errorlevel=BadCRC
errorlevel выставляется также в случаях потери синхронизации и
затирании несчитанного фрейма
ЛЕСЯ
А исходник не остался или пример?
Kovrov
WAKE, если не ошибаюсь это кастрированный SLIP от юникса?
если не изменяет память
транспорт таков:
C0-служ данные-и в конце-CRC8? со стафингом...
там вроде все просто - в чем проблема?
если это конечно он....
ЛЕСЯ
Да все верно. Но вот уже третий день сижу над ним. Растолкуй если можешь добрый человек.
BlackJack
Исходник я дам, не проблема, но в стуктуре данных будешь сама разбираться.
CRC не считал, а использовал обычную контрольную сумму.

Передающую часть сама разберешь.



#define x_crc 1
#define x_ptr 2
#define x_use 3
#define x_cta 4
#define x_end 5
#define x_data 6
#define tx_ptr 0


#define Crc_Init FEND

#define MAX_Pack_sz MAX_FRAME_SIZE - 3
#define PreambulaTime 4

#define FESC 0xDB
#define FEND 0xC0
#define TFESC 0xDD
#define TFEND 0xDC
#define tx_end 1
//FESC=> FESC+TFESC
//FEND=> FESC+TFEND

typedef void (*LRead_CallBack) (signed char);

typedef struct {
unsigned char Pre;//Предыдущий байт
unsigned char Crc;
unsigned char Ptr;//указатель текущего байта в буфере
unsigned char Ready;//флаг готовности буфера
unsigned char CTA;//флаг синхронизации со тсартовым байтом
unsigned char End;//указатель на последний байт в буфере
//unsigned char Length;//Длина пакета
unsigned char Frame[MAX_Pack_sz];
} TFrameBuf;


//-****************************************-/
//-* interrupt handled uart reсеiver /
//-****************************************


#pragma vector=RS485_RXC_VECTOR
__interrupt void USART1_RXC_interrupt( void )
{
register char Sdata,temp;

Sdata=RS485_PORT;

if (Sdata==FEND){
//получен старт, синхронизируемся



RX_driver_Errorlevel=Sinc_err;
Frame_buf.CTA=1;
Frame_buf.Ptr=x_end;//=6, последний байт заголовка перед буфером
if(Frame_buf.Ready)RX_driver_Errorlevel=Buf_overrun;//Set ErrorLevel
Frame_buf.Ready=0;
Frame_buf.Crc=Crc_Init;//то есть =FEND
Frame_buf.End=MAX_Pack_sz+x_end;//потом подрихтуется?????????????????



} else
if (Frame_buf.CTA)//sinchronized
{

temp=Frame_buf.Pre;
Frame_buf.Pre=Sdata;
if (temp==FESC){
if ((Sdata!=TFESC)|(Sdata!=TFEND))
{Frame_buf.CTA=0;
RX_driver_Errorlevel=Sinc_err; //Set ErrorLevel

} ;
if (Sdata==TFESC) {Sdata=FESC;};
if (Sdata==TFEND) {Sdata=FEND;};
} else {// No STuffing

if (Sdata!=FESC){//proceed byte
if (Frame_buf.Ptr==x_end){//first simbol is length
if(Sdata> MAX_Pack_sz)Frame_buf.End=MAX_Pack_sz+x_data;
else Frame_buf.End=Sdata+x_data; };

Frame_buf.Frame[Frame_buf.Ptr-x_end]=Sdata; //Store Byte
//в том числе и CRC!

Frame_buf.Ptr++;
if (Frame_buf.Ptr >Frame_buf.End ){
//pack recd

if (Frame_buf.Crc==Sdata){// crc ok

RX_driver_Errorlevel= RX_OK;
Frame_buf.Ready=1;
Frame_buf.CTA=0;
if ( LL_ReadCallback!=NULL)LL_ReadCallback(Frame_buf.Frame[0]);
//В этом колбаке просто ставится флажок, что данные прибыли

} else {//bad crc
Frame_buf.Ready=0;
Frame_buf.CTA=0;
RX_driver_Errorlevel=BadCrc;

};
} else {Frame_buf.Crc+=Sdata;};// pack rcd
};//proceed
}; //no stuffing
}//Sinchronized
};
ЛЕСЯ
Спасибо BlackJack
Kovrov
Цитата(ЛЕСЯ @ Feb 6 2006, 15:01) *
Да все верно. Но вот уже третий день сижу над ним. Растолкуй если можешь добрый человек.

а что растолковать? что не получается?
ЛЕСЯ
Простыми словами объяснить алгоритм - как принять правильно пакет и передать.
Kovrov
ВОТ пользуйтесь!
Какие то грамотные люди посторались
прям все по полочкам разложено
http://www.spetspribor.com/support/software/wake/wake.html
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.