Cari kesalahan FDCAN yang tidak

Selalu bekerja dengan CAN itu sederhana, tetapi ada yang salah (di perangkat pada KDPV) ...

gambar

Baru-baru ini, saya sering berhasil menggunakan mikrokontroler STM32H750VB, dan dalam satu perangkat saya perlu menggunakan bus CAN, tetapi upaya pertama yang saya lakukan menunjukkan semua kepercayaan diri saya memberikan hasil yang aneh. Kisahnya dijelaskan di bawah ini.

Jadi, pertama tentang sirkuit. Pada KDPV dilingkari dengan warna hijau, tentu saja, pelakunya adalah mikrokontroler, tidak ada yang rumit dengan CAN - terhubung sesuai dengan

gambar

MAX3051 digunakan sebagai lapisan fisik (well, saya suka ..), seperti ini:

gambar

Sebelumnya, bukannya STM32H750VB, STM32F107 berada di sistem yang sama, tetapi orang tua itu tidak bisa mengatasi tugas dan diputuskan untuk menggantinya dengan yang lebih modern dan muda .

Tapi ini nasib buruk - mikrokontroler lama memiliki bxCAN, dan yang baru sudah memiliki FDCAN. Meskipun ada perbedaan, tetapi dari sudut pandang kode (dan bekerja - perangkat di bus sudah tua): penggantian sangat sederhana. Bagi yang ingin, Anda dapat membandingkan:
ApakahTelah menjadi
  MX_CAN1_Init (); 
  MX_FDCAN1_Init (); 
     hcan1.Instance = CAN1;
     hcan1.Init.Prescaler = 4;
     hcan1.Init.Mode = CAN_MODE_NORMAL;
     hcan1.Init.SyncJumpWidth = CAN_SJW_4TQ;
     hcan1.Init.TimeSeg1 = CAN_BS1_15TQ;
     hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
     hcan1.Init.TimeTriggeredMode = DISABLE;
     hcan1.Init.AutoBusOff = ENABLE;
     hcan1.Init.AutoWakeUp = DISABLE;
     hcan1.Init.AutoRetransmission = DISABLE;
     hcan1.Init.ReceiveFifoLocked = DISABLE;
     hcan1.Init.TransmitFifoPriority = DISABLE; 
   hfdcan1.Instance = FDCAN1;
   hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
   hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
   hfdcan1.Init.AutoRetransmission = ENABLE;
   hfdcan1.Init.TransmitPause = DISABLE;
   hfdcan1.Init.ProtocolException = ENABLE;
   hfdcan1.Init.NominalPrescaler = 1;
   hfdcan1.Init.NominalSyncJumpWidth = 3;
   hfdcan1.Init.NominalTimeSeg1 = 11;
   hfdcan1.Init.NominalTimeSeg2 = 4;
   hfdcan1.Init.DataPrescaler = 1;
   hfdcan1.Init.DataSyncJumpWidth = 3;
   hfdcan1.Init.DataTimeSeg1 = 11;
   hfdcan1.Init.DataTimeSeg2 = 4;
   hfdcan1.Init.MessageRAMOffset = 64;
   hfdcan1.Init.StdFiltersNbr = 0;
   hfdcan1.Init.ExtFiltersNbr = 0;
   hfdcan1.Init.RxFifo0ElmtsNbr = 4;
   hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
   hfdcan1.Init.RxFifo1ElmtsNbr = 4;
   hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
   hfdcan1.Init.RxBuffersNbr = 4;
   hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
   hfdcan1.Init.TxEventsNbr = 4;
  if (HAL_CAN_Init (& hcan1)! = HAL_OK) { 
  if (HAL_FDCAN_Start (& hfdcan1)! = HAL_OK) { 

Secara umum, perbedaan kosmetik. Dan bagi saya sepertinya itu akan bekerja sekaligus dan benar.

Namun, itu tidak langsung berfungsi ...

Kontroler CAN tidak dapat menetapkan level dominan dan masuk ke kondisi Bus-Off, dan tidak ada data yang diterima dari bus (terlepas dari kenyataan bahwa perangkat lain di bus secara stabil mengirim paket dua kali per detik).

Yah, saya pikir, garis debugging datang, dan menyolder kabel pada jalur CAN-RX dan CAN-TX (sebenarnya, melihat bus itu sendiri tampak logis - perangkat itu diam, dan perangkat lain yang terhubung mengirim paket , sesuai kesepakatan ).

Setelah itu, mode FDCAN_MODE_BUS_MONITORING pertama kali dihidupkan. Dan, lihatlah, saya segera melihat paket dari bus! (Dalam mode ini, pengontrol CAN hanya dapat mendengarkan data, tetapi tidak mengirimkan apa pun). Sangat bagus ...

Kemudian mode FDCAN_MODE_EXTERNAL_LOOPBACK dihidupkan (dalam mode ini, sebaliknya, kita hanya mendengarkan diri kita sendiri, tetapi kemudian kita mentransfer semuanya ke bus). Dan pada garis CAN_RX dan CAN_TX semua paket data muncul - keduanya dikirim oleh perangkat itu sendiri dan diterima dari bus, di sini di
Pada gambar di bawah (data abu-abu TX dari mikrokontroler, garis data oranye RX) mereka terlihat sebagai puncak:

gambar

Jadi, setelah percobaan ini, menjadi jelas bahwa rangkaian bekerja dengan benar, pengontrol CAN dalam mikroprosesor dapat menerima dan mengirimkan data.

Namun, ketika mencoba untuk secara bersamaan menerima dan mengirimkan data, sistem masih menjadi Bus-Off dengan kesalahan dalam register kontrol kesalahan (register status protokol FDCAN (FDCAN_PSR)) LEC [2: 0] = 5 - yang berarti dari lembar data Bit0Error: Selama transmisi pesan (atau bit mengakui, atau kesalahan aktif
flag, atau flag overload), perangkat ingin mengirim level yang dominan (data atau bit pengidentifikasi
nilai logis 0), tetapi nilai bus yang dipantau adalah resesif ...

Setelah dua hari siksaan (jelas apa kesalahannya, tetapi tidak jelas bagaimana cara memperbaikinya) dan studi yang cermat tentang lembar data, errata, dan sekelompok kode dan manual pihak ketiga, pencerahan sampai pada pemahaman saya - saya melakukan semuanya dengan benar, tetapi saya tidak berhasil!

Yah, saya pikir, mungkin masalahnya ada di teknologi, dan ... mengganti mikrokontroler itu sendiri (dengan yang lain dari batch yang sama). Dan ... itu berhasil! Ya, di sini, tanpa menari dengan rebana masalah, dengan kode sumber dan sebagaimana mestinya menjadi yang pertama kalinya.

Ringkasan Singkat


Rupanya, spesimen licik seperti itu muncul. Tetapi di sisi lain, saya berhasil menggali lebih dalam pekerjaan FDCAN secara umum, yang dapat dikaitkan dengan nilai tambahnya. Dan untuk minus ... Dan untuk mereka dapat dikaitkan dengan waktu yang hilang (controller dapat dilampirkan ke proyek lain) dan pemahaman bahwa pengontrol modern buggy dengan kekuatan yang mengerikan, juga, dengan cara modern (atau apakah ini juga merupakan nilai tambah?).

Source: https://habr.com/ru/post/id483590/


All Articles