Введение в MCP2515
Автор: Алексей, grom2 Возникла у меня необходимость пообщаться с CAN контроллером MCP2515 производства Microchip. Поиск примеров кода в русскоязычных интернетах не увенчался успехом, пример обнаруженный на форуме микрочипа воодушевлял только до его прошивки в АТмегу и проверки... и по результатам изысканий родилась идея написать статью. О самом интерфейсе писать не буду. //Read from CANSTAT reg Горит только PORTА.7 - все нормально. //Set config to CANINTE reg Пишем в регистр RXBnCTRL //Set config to RXB0CTRL regCS1=0; delay_us(2); spi(0x02); spi(0x60); spi(0x04); //set rollover delay_us(2); CS1=1; delay_us(2); Теперь у нас при наполнении регистра RXB0 (запись восьми байт) данные переходят в регистр RXB1. //Set config to RXB0SIDH reg CS1=0; delay_us(2); spi(0x02); spi(0x62); spi(0x00); //set indentifier delay_us(2); CS1=1; delay_us(2); Идентификаторы отправляемых данных можно установить при записи в регистры TXBn а можно и отдельно. CS1=0; delay_us(2); spi(0x02); spi(0x62); spi(0x08); //set data length code delay_us(2); CS1=1; delay_us(2); Устанавливаем назначение выводов #RX0BF и #RX1BF: //Set config to BFPCTRL regCS1=0; delay_us(2); spi(0x02); spi(0x0C); spi(0x0F); //set RXnBF pins like the interrapt pins delay_us(2); CS1=1; delay_us(2); Теперь на них будет 0, когда данные будут в соответствующем буфере. //Set config to CANCTRL reg CS1=0; Режим - loopback, CLKOUT включен, входная частота сразу делится пополам, что можно наблюдать осциллографом. Инициализация закончена, хотя можно еще записать кучу других нужных регистров, пора передавать данные. CS1=0; a=2*nB+0x40; //nB - номер буффера 0, 1 или 2 Можно записать и используя адреса регистров, тогда, единожды прописав регистры TXBnSIDH, TXBnSIDL, TXBnEID8, TXBnEID0 и TXBnDLC, можно записывать данные в регистры TXBn, используя команду LOAD TX BUFFER, начиная с байта данных D0 (значение а, естественно, вычисляется по-другому, см. даташит). //Set config to TXB0CTRL reg Готово, можно проверить записанные данные, считав из регистров TXBnDm, например: //Read from TXB0D7 reg Моргнул PORTА.3 - все в порядке. Посылаем команду на отправку из TXB0: delay_us(2); Попробуем считать. Запускаем цикл считывания из регистра CANINTF, пока бит RX1IF не станет равным 1, и считываем данные из регистра RX1B (nB=1). Почему из первого? Так данные заполнили регистр RX0B и перешли в RX1B: do { spi(0x03); CS1=1;} while ((IF&0x02)==0); a=0x92; PORTA=data; Готово, PORTА показывает то, что было послано.
Все вопросы в Форум.
|
|
|||||||||||||||
|
||||