реклама на сайте
подробности

 
 
> AT90CAN128 проблема, не работает связь
kashey
сообщение Jun 2 2006, 13:14
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 6-12-05
Пользователь №: 11 887



Для начала опишу ситуацию.
Есть 2 контроллера, со светодиодами, надо чтоб один отправил пакет с данными(не важно какими), а второй принял уведомление и засветился лампочками!

Вот исходники
1. Передатчик

Код
void Init()
{
char i;

// Reset
CANGCON  =  (1<<SWRES);

// Init Bit Timing
CANBT1 = 0x06;        // BPR = 2; Tscl = 2.5*10^7
CANBT2 = 0x08;        // PRS = 3;
CANBT3 = 0x5A;        // PHS1 = 4; PHS2 = 4;

// Init Mailboxes
for(i = 0; i < Mailboxes; i++)
    {
        CANPAGE = (i << MOBNB);
        CANSTMOB = 0;
        CANCDMOB = 0;
        CANIDT4  = 0;
        CANIDT3  = 0;
        CANIDT2  = 0;
        CANIDT1  = 0;
        CANIDM4  = 0;
        CANIDM3  = 0;
        CANIDM2  = 0;
        CANIDM1  = 0;
        CANMSG = 0;
    }
// Enable Can
CANGCON |=  (1<<ENASTB);
}

void Send(char mailbox, ulong idt, char *data, char len)
{
       // Select Channel
       CANPAGE = (mailbox << MOBNB);

    CANSTMOB = 0x00;
    CANCDMOB = 0x00;

    CANIDT1 = (char)(idt >> 3); /* Not sure */
    CANIDT2 = (char)(idt << 5);

    CANCDMOB |= len;

    for(; len != 0; len--)
        CANMSG = *data++;

        CANCDMOB &= (~CONMOB_msk);
        CANCDMOB |=  (CH_TxENA  << CONMOB);
}

int main()
{
        char d[]="12345678";

    // Led
    DDRG = 0x03;

        Init();

    Send(0, 1, d, 8);
    
    for(;;)
    {
        if(CANSTMOB & 0x01)        // ACK Error
            PORTG |= 0x01;
        
        if(CANSTMOB & 0x40)        // TxOk
        {
            PORTG = 0x02;
            break;
        }
    } /*     for(;;) */
    return 0;
}


/*----------------------------------------------------------------------------------------------------------*/
2. Приемник

Код
void InitRxMailbox(char mailbox, ulong idt, ulong idm);
{
CANPAGE = (mailbox << MOBNB);

        CANSTMOB = 0x00;
        CANCDMOB = 0x00;

        /* 11-bit identifier tag  */
       CANIDT1 = (char)(idt >> 3); /* Not sure */
       CANIDT2 = (char)(idt << 5);
       CANIDT3 = 0;
       CANIDT4 = 0;
       /* 11-bit identifier mask */
       CANIDM1 = (char)(idm >> 3);
       CANIDM2 = (char)(idm << 5);
       CANIDM3 = 0;
       CANIDM4 = 0;

       CANCDMOB |= NB_DATA_MAX;                /* set Data Length Code */
      
       CANCDMOB &= (~CONMOB_msk);
       CANCDMOB |=  (CH_RxENA  << CONMOB);
}

int main()
{
        // Init из передатчика
        InitRxMailbox(1, 1, 0x3FF);

        // Led
        DDRG = 0x03;

        for(;;)
        {
            if(CANSTMOB & 0x20 || CANSTMOB & 0xA0) // Rx Complete
                {
                    PORTG = 0x02;
                    break;
                }
}



/*----------------------------------------------------------------------------------------------------------*/

И в итоге получаем, что в CANSTMOB передатчика все время висит флаг того, что передача не подтвержена (ACK не выставляется)

Если я правильно понимаю, то этот бит должен выставлятся приемником при успешной передаче.

Подскажите люди добрые, где возможна ошибка или недоработка!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01328 секунд с 7
ELECTRONIX ©2004-2016