Есть 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;
}
{
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;
}
}
{
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 не выставляется)
Если я правильно понимаю, то этот бит должен выставлятся приемником при успешной передаче.
Подскажите люди добрые, где возможна ошибка или недоработка!