Monthly Archives: April 2023

ARM45: CAN bus

Iš archyvo ištraukiau “motininę PCB” su nesupjaustytom schemutėm. Tai husqvarnos išmanios žoliapjovės “loop sensor” plokštė. Dabar tas “loop” visiškai nedomina. Prilituojam USB lizdą ir bandom suprogramuoti CAN protokolo siuntėją ir gavėją.
husqvarna loop sensor can usb board

PCB numatytas maitinimas iš CAN jungties, todėl norint maitinti iš USB, reikia pajugti papildomą laidelį. Visą kitą paliekam kaip buvo. Iš aiškių elementų: Texas Instruments TCAN330 čipas ir SPI EEPROM, toliau komparatorius, analoginis multipleksorius ir keletas tranzistorių. Loop ryšiui- ritė laido juodame korpuse.

husqvarna loop sensor can usb board
Perdaryta plokštė jau su ISP jungtimi ir sujungta į grupę per CAN laidus (laidinio telefono kabelis).

USB CAN schema STM32F
Procesoriukas (STM32F302CCT6) turi “hardwarinį” CAN, tai dar ir panaudojus CubeMX sukurtą skeletą darbo nelieka daug. Ryšiui su išoriniu pasauliu nutariau panaudoti USB CDC (serial) įrenginį. Kad viskas veiktu, procesoriaus CLK turi būti kiek aukštesnis nei pagal nutylėjimą sugeneruoja kubikas. Aš pasirinkau 72MHz, maksimumą. Dar, kad nesipjautų pertraukimai, CAN RX1 kiek pažeminau prioritetuose iki “1”.

Apie softą:
CAN siuntimui naudojam HAL paprogramę HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox). TxHeaderyje nurodom kam siunčia ir kokio tipo paketas. TxData- tai max 8 baitai duomenų. TxMailbox- nežinau kas tai, teoriškai “pašto dėžutė” kurioje kabo paketas, kol nėra pristatytas. Kaip jis veikia nežinau ir nesvarbu.

CAN paketo priėmimas kiek įdomesnis. MCU turi kažkiek “hardwarinio” spartinimo, todėl paketų filtrą ir priėmimą galima automatizuoti. Pats priėmimas geriausiai veikia per pertraukimą- gaunam paketą, jį priima ir pakelia vėliavėlę. O toliau jau softas rūpinasi kas bus toliau.
Todėl pirma reikia sukonfiguruoti paketų filtrą:

void can_filter(void) //CAN filtas- tai hardwarinis (softwarinis) paketu filtras, kad duomenys eitu tik reikalingi.
{
CAN_FilterTypeDef canfilterconfig;

canfilterconfig.FilterActivation = CAN_FILTER_ENABLE;
canfilterconfig.FilterBank = 10; // which filter bank to use from the assigned ones??? Kodėl?
//canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //Ziureti kuris yra. Šits kažko neveikė
canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO1; //O šitas jau veikia.
canfilterconfig.FilterIdHigh = CAN_ID_RX << 5;
canfilterconfig.FilterIdLow = 0;
canfilterconfig.FilterMaskIdHigh = CAN_ID_RX << 5;
canfilterconfig.FilterMaskIdLow = 0x0000;
canfilterconfig.FilterMode = CAN_FILTERMODE_IDMASK;
canfilterconfig.FilterScale = CAN_FILTERSCALE_32BIT;
canfilterconfig.SlaveStartFilterBank = 0; // how many filters to assign to the CAN1 (master can)
// doesn't matter in single can controllers
HAL_CAN_ConfigFilter(&hcan, &canfilterconfig);
}

Čia yra niuansų- CAN_FILTER_FIFO0 ir FIFO1.

Ir kitas niuansas RX pertraukimo Call-back:

void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) //RX interrupto callbackas. Gali buti "Fifo0", zr. filtrą ir galimus int.
{
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO1, &RxHeader, RxData);
CAN_MSG_R=1;
}

Matot “CAN_RX_FIFO1” ir “HAL_CAN_RxFifo1MsgPendingCallback”? Fifo0 ar Fifo1 nėra taip paprastai pasirenkamas, o nuo ko priklauso aš pilnai ir nesupratau. Kažkodėl FIFO0 neveikė. Gal buvo per vėlus vakaras ar panašiai. Bet su FIFO1 viskas veikia.

Kitas momentas- pirma sukonfiguruoji, poto paleidi. Jei reikia perkonfiguruoti- pirma stabdom, poto perkonfiguruojam ir poto paleidžiam:

can_filter(); //pirma filtras, poto start
HAL_CAN_Start(&hcan );
HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO1_MSG_PENDING);

Visas veikiantis demo source kodas: STM32F302 USB CAN writer reader source code.
Ten dar yra windows console programėlė filtro konfiguracijos testavimui (su source code, ne mano).

ARM44: Netikras flešiukas

Norim imituoti USB Flash diskelį? Jokių problemų su STM32F103.
STM CubeMX programoje pasirenkam turimą procesoriuką, įjungiam USB DeviceFS, middleware sekcijoje pasirenkam USB-DEVICE-Mass Storage Class. Sugeneruojam kodą.

Eima į aplanką “\USB_DEVICE\App” ir redaguojam failą “usbd_storage_if.c”:


#define STORAGE_LUN_NBR 1
#define STORAGE_BLK_NBR 0x28000 / 0x200 //Čia mūsų disko dydis padalintas iš sektorių dydžio. Tai mažas diskelis.
#define STORAGE_BLK_SIZ 0x200 //Čia sektoriaus dydis, 512 baitų

kiek žemiau ieškom skaitymo iš disko procedūros:

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
memcpy(buf, disk + blk_addr * STORAGE_BLK_SIZ, blk_len * STORAGE_BLK_SIZ);
return (USBD_OK);
/* USER CODE END 6 */
}

Tai netikras diskas, todėl skaitysim iš MCU flash atminties, o rašymus į diską ignoruosim. Šioje vietoje paprasčiausiai “memcopy” iš flaš atminties į skaitymo buferį. Atmintis adresuojama baitais, o procedūra užklausinėja sektoriais (blokais). Todėl reikia dauginti iš bloko dydžio.

Toliau reikia sugeneruoti 8″ disketės image. Kodėl? Todėl, kad ji maža ir jos imidžo generatorių galima lengvai rasti internete. Kadangi nemoku su linkeriu prijungti tiesiogiai binarinių failų, tai su savo programa skirta šriftams sugeneruojam C kodą su imidžu.
Diskas tikrai netilps į mažo MCU atmintį, tai reikia kiek pataisyti:


const unsigned char disk[163840]={
0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x57, 0x49, 0x4E, // 00
0x34, 0x2E, 0x31, 0x00, 0x02, 0x01, 0x01, 0x00, // 01
0x02, 0x40, 0x00, 0x40, 0x01, 0xFE, 0x01, 0x00, // 02
...

Sukompiliuojam, supumpuojam į procesoriuką ir:

usb flash disk on STM32F103
Gaunam “Read Only” USB diską. Visus rašymus diskas ignoruoja, todėl Windows per daug nepyksta, nes jai vaidenasi, kad viskas OK. Netgi matom, kad “System Volume Information” susikūrė.

Visas source code (su įžymiuoju penis.jpg):STM32F103 source code for USB mass storage (flash disk)

Kam visą tai naudingą? Ogi, galima prijungti SD diskelį ar SPI flash mikroschemą. Kokius nors duomenis loginti per fatfs į mikroschemą, o kai prisijungiam prie kompo per USB, visi duomenys matosi kaip failai.
O jei mokate gerai programuoti, galima “on the fly” generuoti FAT failų sistemą ir skaityti ar rašyti informaciją. Nereikia jokio softo hoste- visi duomenys matosi kaip virtualūs failai.

Griekas 2

Buvo straipsnis apie Grieką.

Dabar naujas, didesnės rezoliucijos…
Pekino antis griekas

Receptas: viena pekino antis, viena elektrinė orkaitė, viena moteris kuri aptrina prieskoniais tą antį.

Kepimas: Tai riebi antis. Todėl kepti reikia ilgiau. Antis sukišama į kepimo rankovę jau apiprieskoniuota. Ir papūdoma šaldytuve 24…48 valandas. Orkaitė įkaitinama iki 200…220℃ temperatūros. Antis kišama į karštą orkaitę ir kepama apie valandą laiko (skaičiuojant nuo inkišimo). Jei tai maža šaldyta antis, šis etapas kiek trumpesnis. Šio etapo metu nutirpdomi riebalai ir pageltoninama škūra.
Toliau sumažinam temperatūra iki 150…120℃ ir kepama dar apie valandą (mažesnėm trumpiau). Jau galima valgyti, bet kol visi maisto valgytojai susirinks, antį palikti orkaitėje ir kaitinti iki 100℃ (70℃) temperatūroje (hipsterinis lėtas kepimas).
Kol antis kepa, rekomenduojama pakeisti virtuvės čiaupą ir kanalizacijos vamzdžius. Taip greičiau praeis laikas.

Kai susirenka visi prie stalo, ir ypač tie, kurie vėluoja, tada išimam blėką su antim ir atsargiai išimam antį iš kepimo maišelio. Kodėl atsargiai- nes antis linkus subyrėti į gabalėlius. Valgyti karštą ir su mažiau balasto (daržovių).

Rekomenduoja kepti antį krutine į apačią- taip krutinėlė gausis minkšta. Visus riebalus gali išsaugoti ir kepti ant jų visokias bulvytes. O galima ir išpilti į krosnį ir sudeginti.

Mėsai valgyti nereikia peilio- visos dalys išsiardo pačios.

ARM43: Parduoto gyvenimo laikrodis

Bevaikščiojant po …lobyną, pamačiau nerusišką matuoklį. Kodėl jis “nerusiškas”? Ogi todėl, kad jis elegantiškas, gražus, matuoja velniai žino ką ir yra ne rūsiškas. 🙂

Skalė matuoja kažką nuo nulio iki dėvynių. Benešant iš sandėlio kilo mintis. Besidalinant mintimis su žmonėm vienas netgi iškarto pasakė- padarai, perku už 100€. Bet ir pačiam mintis patiko.
9h laikrodis
Tai parduoto gyvenimo laikrodis. Kiekvieną rytą, darbo metu jis rodo nuo 9 ir po truputi mažėja iki nulio. Lygiai penktą valandą po pietų, matuoklio rodyklė priartėja prie nulio ir daugiau nekruta iki kito ryto. Nuotraukoje jis toks nučiupinėtas, nes ką tik pagamintas ir nenuvalytas.
Continue reading →