Главная Форум
Добро пожаловать, Гость
Логин: Пароль:
  • Страница:
  • 1

ТЕМА: Передача данных по CAN

Передача данных по CAN 6 года назад #173

  • vasek
  • Вне сайта
  • Юниор
  • Постов: 1
Доброго времени суток! Т.к. я совсем новичек и много чего еще не понимаю, опишу суть проблемы. Имеется контроллер AT90CAN64. Необходимо организовать только передачу данных по CAN. По гуглив, почитав datasheet на русском и найдя кое - какие примеры, состряпал свою программу в CodeVision. После прошивки посмотрел осциллографом сигнал непосредственно на выходе CAN, а затем на ноге TX контроллера. Сигнал отсутсвует везде. Ниже привожу код моей программы с коментариями. Прошу гуру данного форума дать дельный совет и указать на мои косяки, ибо работа горит. Заранее спасибо.
Код
unsigned char i;
unsigned char datatx_buf[8];

void ResetAllMailbox (void) // сбрасываем регистры (вроде как рекомендуется)
{
unsigned char num_channel, num_data;

for (num_channel = 0; num_channel < 15; num_channel++)
{
CANPAGE = (num_channel<<4);
CANSTMOB = 0;
CANCDMOB = 0;
CANIDT4 = 0;
CANIDT3 = 0;
CANIDT2 = 0;
CANIDT1 = 0;
CANIDM4 = 0;
CANIDM3 = 0;
CANIDM2 = 0;
CANIDM1 = 0;
for (num_data = 0; num_data < 8; num_data++)
{
CANMSG = 0;
}
}

}

void CAN_Init()
{

CANBT1=0x00; // CAN System Clock: 8000,0 kHz
CANBT2=0x0C; // Propagation Time Segement: 0,875 us, Re-Sync Jump Width: 0,125 us
CANBT3=0x37; // Sample Point(s): 3, Phase Segment 1: 0,500 us, Phase Segment 2: 0,500 us
CANTCON=0x7C; // CAN Timer Clock Period: 125,000 us


CANGCON |= (1<<SWRES); //сброс общего регистра управления CAN
ResetAllMailbox (); // вызов функции сброса регистров

//Настройка MOb1=Tx на передачу
CANPAGE = 0x10; //Выбор номера Mob, в данном случае Mob1
CANSTMOB = 0x40; //Установка бита удачного завершения передачи TXOK, для 1-й передачи, зачем то везде ставят
CANCDMOB = 0x08; // длина данных 8 байт

CANIDT4 = 0x00;
CANIDT3 = 0x00;
CANIDT2 = 0x20; //Идентификатор равен 1
CANIDT1 = 0x00;
CANIDM4 = 0x00; //Принудительный положительный результат сравнения
CANIDM3 = 0x00;
CANIDM2 = 0x00;
CANIDM1 = 0x00;

CANEN2=0xff; //Разрешить все Mob
CANEN1=0xff;
CANIE2=0x00; //запретить прерывания по всем Mob
CANIE1=0x00;

CANHPMOB=0x10; //Установка высшего приоритета для MOb1

CANGCON |= 0x02; //Разрешить контроллер CAN
}

void can_send (unsigned char n)
{

CANPAGE = (n<<4); //Выбрать n-й канал, автоинкремент, местоположение байта данных в FIFO 0
if (CANSTMOB & (1<<TXOK)) //Если бит TXOK регистра CANSTMOB установлен в 1
{
CANSTMOB &= 0; //Сбросить регистр состояния объектов сообщений

for(i = 0; i < 8; i++)
{
CANMSG = datatx_buf[i]; //Запись данных в регистр данных CAN
}
CANCDMOB |= (1<<6); //Разрешение передачи,длина данных 8 байт
CANCDMOB |= (1<<3);
}

}

void main(void)
{
CAN_Init();
datatx_buf[0]=0x0A;
datatx_buf[1]=0x0B;
datatx_buf[2]=0x0C;
datatx_buf[3]=0x0D;
datatx_buf[4]=0x0E;
datatx_buf[5]=0x0F;
datatx_buf[6]=0xAA;
datatx_buf[7]=0xBB;
can_send(1);
  • Страница:
  • 1
Время создания страницы: 0.26 секунд