From 7d77df3d4b40722d4e79d03ad1665ad6b0678fce Mon Sep 17 00:00:00 2001 From: Ihor Nehrutsa Date: Tue, 29 Aug 2023 16:35:18 +0300 Subject: [PATCH] esp32\machine_can: Add CAN docs. Signed-off-by: IhorNehrutsa --- docs/library/img/can_mode_listen_only.png | Bin 0 -> 3572 bytes docs/library/img/can_mode_loopback.png | Bin 0 -> 3669 bytes docs/library/img/can_mode_normal.png | Bin 0 -> 3513 bytes docs/library/img/can_mode_silent.png | Bin 0 -> 3632 bytes docs/library/img/can_mode_silent_loopback.png | Bin 0 -> 3646 bytes docs/library/machine.CAN.rst | 275 ++++++++++++++++++ docs/library/machine.rst | 1 + 7 files changed, 276 insertions(+) create mode 100644 docs/library/img/can_mode_listen_only.png create mode 100644 docs/library/img/can_mode_loopback.png create mode 100644 docs/library/img/can_mode_normal.png create mode 100644 docs/library/img/can_mode_silent.png create mode 100644 docs/library/img/can_mode_silent_loopback.png create mode 100644 docs/library/machine.CAN.rst diff --git a/docs/library/img/can_mode_listen_only.png b/docs/library/img/can_mode_listen_only.png new file mode 100644 index 0000000000000000000000000000000000000000..45fb05f57f62c3429b2c4ba1cf67336b71035718 GIT binary patch literal 3572 zcmZ8kc{r3^8y{p#_E(Kv*4H+hWte0g>qOSdRt7WHv5Y|~yDW)jM50pJGDAbwA{3G} zJMTocEFoD^vi3dR@BQQbzUzAK=UnHU-~BuHxzBx{CB@pxl>4~IaS#Z^ZEl9P1xn{5 z;a~&)VwyWSK*1DZYibChe-K*&D#yGGEDb=Q7k9Y!v8+IyGsw&_1O(z~I})ZWWgbzW zk=Y$%iU$2oy3^AP)Z|FUmq?yi5)S1-!~q2e0fQq|;RscPwmn=Og@Bw4?f~ZK~oi`sfy6Dha*rL+Q9c;h5g<11VF*$XoQeJJSiMY#DUBSSTCF< z*2~AkPf8PlgdkLrQUHU7Dh#QLP?NHOYf5>ONI@tlG(0>U;&X%s1VBRqiC!{N?3Dl` z_=wToJCxv#LZJgaLJ7D45(;GvKtn+AXTKYu|A+Z|Occr+=i}u~0>L$5_54*^Gt2*QE>wh9^);H6i2!Rr5bEbRdl2(GS)gu{^9 z+S-$$RT%(;_g_4AKG$#{n4w{2zV26`%jsWT4z}hXypKN)m_9TNOFZ%cG!zEc)`laH zP+*m?f477XutXBzeH_Fm03Qhb+nf-n2R7hHt{in-2?0m~ND#or%ujv`AQ0DGbF_i| z)yu1oypl((PPMKV|Ek!g z`{7m_8?H_5r+4P6(!-Ijg1=Ac@O|r*&6(5H4*AfNqrE8q-N#x&%s`eAIQiPfG+oR_ zFKVC6BJtH=@^yqmZ>~o4s=lUH=yE2M@Ufb2ji4Fu+^J?z_~(wa+}_sG5G`!=BkgkI zHJZo!^gkjhV#3!Zsfu>RCH0{zG%}fd<)+~)HrX@AxBh6N$e1q6Nt8|Rd|zz3v9r13 zRO?U8{&k}>+U8JHFZyt}IieyiIho^NJg`k_+-Q25vMQxhDUQxR?OY|fytlo!yfRi! z|9BOj_em1Hv^zp`z;KJB?0fISjd)O;Z1yXo&+QnMxFO606I=Z1c-=*A5%qpd)J*4H z1)4>c63w>A!uNf;xb4aKudyubv{xaET?Ww`Gp+1DwwCOKBk>(%0~1Rpq;2HhPs_8{ zw#;x{ndb9dS(p!z8?!feH|J9a>y3%&qsF$K8FF?>yps1mt2$Ma&)2!FO*SrnU+kk{ zvLV+xp=~B%Co~MJl6fJQUzfaA?pj*w&&Xfsdt46qN$!2v+T?Q)P5+WaZc%yY zv7WrM&Kdy|mo7u@qe5x9YF_Dpu~~yA6-tr2Tl9~EMVMz93ft#JoktnBGsqwLWla7g z=ocpPNg3Ddg4<8NO}r|AxV)5FG(ru&_UshcIo$Yc${>IHjZ(QAdAJ`jQte}x zg$ng$^yQsxu*g9a)f4A$)kp5tiXc3bOP=*UKz0Y)TYg{Y#jRIkTNBMP4m1z}iMYyv zf$}TOquWs)V{}({onPqlk|>hd*{Jx*79wn8TMX zz7=!*=hqzn3$Aag3+n=>EL_3c+iO!Rrp!s1yI!&|`wb>vW_OC4Sx<&sYS(>uLCMKs zV_?$ruMZFQx_N0f1&Ms!qXnkCJ1_X|IPKg`D4_9(X-Towp;H8ChBuGXy!!Hp(9aR4 zC7ErohcOcTp>utYulRq6XXmvC7VlmAy8l)tNSv){d~o;6E>r8uGhtL?o1=I8@F@X- z{Iz#zG&%wL=bs&Q-UHGMUM{ZhK64!!xx;&L@$r#Pdamg^EWKKLN*Bt$j5kF#3_s^g z8-B*%r>3H6AP+J>HD15itR!DOx;%8veRnc2At~wir?$% z04*tZD81l2@iLg^H%6a@ybN2-9X1Z6>c=ws0{P>f`ZdO{qquYEIy_fBAO;9@+S_>c zQiFIlYK9y}srOq4JUV8;2shW0V|V*X5|8-YUM*p~5VDN>tm|K^KlUkQQlHt9hEr?u z%TSy$*ousH8^*<~!0#;(yYe4|(V6gN)7AKu4*X!O zd?1LkjT6rbghtw6c5xB-F#OC6s?z6Mj+)o#cBYb3b;&KP)hf+^LPg2tfkMhKW zR2g9`<&r~TT2-?v{hO!gau2Yi8%c}7v5IFp@EN%~gZghmJ=IFyiq-|q7-|qcs%zkT zz(1CT6b`&wVm`X*4uT>HXB;w_#wckrzc=T*5el8RqCDCskKdPdD}Kz11iP_W;Wt;~ zRyx`jU7DjJBhPmhA{sfB-CDBw=YaSdDRZnU6!rerJ(Kb)^qi)#+pNR?TL~F=W-A>U1gx`)#Z^=T;f^2Pr5(^ z=NP2;RWaX~otc?YQc+PM9z6XNR3yTAEMW4rVx*tE>?JuNj;o%2ZpKH+Bel;aQC{^)1H60}=G1?2Vf^-Q+E z3=~xUoOlc>MjQQ16GeJvXz*EGkA8~^YH_&awgmNN>H!-!%WGCfl*UCj?yJDvhKenl zfNd?ZPsF8pU#0&^w0Mc5$Unzbf@y91dPf+a1cRqVX58Sa=NXPW{_HcrS>{eYDAx&0 zVd^Ov*C>^6J_{d=AEnxv<~s?V`S4I%1|yv8Sk3jTdZ^G`rdyw0#mHRw4{PbQc&P1Io_-?ZE3Ht ztcuf9`l1D}>23*J=kHW`_?ctu)%lE|o_AdqQh3EOdh`0a7nhl zzQ|f|+%5Fu76*09^gNxEU@#?W6Sa;rlB1-?6cps1WH=K1B&yoTUklIGehTB7(bzN7 z(a4WaR;!e$aW6Hr|Uc&E#*4^e)L|Akb z%)@u)P|_V=rtrPF4tXgWV{>2B-gm=P6cPop-oh)#LL|0lBpzP>eHgisWzE}X2u?mt zeTb0=T3*z?YPIY^nScB(XEs`7YYqO!*gtXjkbwC!S?IA=aK4I}f;-oFi5%I^CjA&i zYQj3Fpi!%#F{1yoy0nMf^c@Ma*O(Sk6zp`^!;t-7!5i1_VvaXgV#}`b%N~>ZNns^# ziTrW~2|T|esdqW!`)12aD3>nh7;qbT;OPh3%$P3CLk8x(_T02!Wo0!VhEF+8^)}{+ znvvK9@};hAeHqw%%w>jDJhMZQg~{6SWSmg^;?UJ|dN}hg9IPlCcYEX|+2{)!r9sTY z_6^7+=xrP;g{t0xZRwsb5@hl5JZG{@@g&v^=JuS`a1SDr%bwfqkg3_eqVd z)g^WtcK?Yxk-55_1%^_5ibzBKo@p@V_D(6&{!|IqH;)NHAwltA8vnDH1SvvW!H|mZ zf^?&-Hq^E-Ssn8s_K(4n{JQU(7;CqODN5-s6V)8U$GBD)&&*|3+dl?&==Txz3I#SP zmk(9RbC9ib_ld10WNcc$Z(b_vS|*E=XlO;=qZozD0(YS$%7?%CL*1Jcl85wBoU($5 zfnXgefm>}x(!Du|4{!N45Wmi|$~dsrQzXrXiWzq7zHGJ>eYzK$QoZX;)Nm)E51^ocVq zH|KA*vD4+o)68;P-$ft$Cy9Xz=|35M!s0;E59h^KvD^0)cm#mVjjhmhL$|p90MoLD AvH$=8 literal 0 HcmV?d00001 diff --git a/docs/library/img/can_mode_loopback.png b/docs/library/img/can_mode_loopback.png new file mode 100644 index 0000000000000000000000000000000000000000..73c3290fc5864a75e951f8af85389ccdc503969e GIT binary patch literal 3669 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 literal 0 HcmV?d00001 diff --git a/docs/library/img/can_mode_normal.png b/docs/library/img/can_mode_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac218a2aafe1dd3567ed8778b245d6dd97e7575 GIT binary patch literal 3513 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 UXY@q@FL{u;skKR+k!Rw+0hLWxivR!s literal 0 HcmV?d00001 diff --git a/docs/library/img/can_mode_silent.png b/docs/library/img/can_mode_silent.png new file mode 100644 index 0000000000000000000000000000000000000000..5b74491be0bfe1a0468dedb7b2b9ce1cf5c6ac41 GIT binary patch literal 3632 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 UDQ)f#{7!%{Cf3H)hHlaS1ADxUtN;K2 literal 0 HcmV?d00001 diff --git a/docs/library/machine.CAN.rst b/docs/library/machine.CAN.rst new file mode 100644 index 0000000000..8ca920fbbf --- /dev/null +++ b/docs/library/machine.CAN.rst @@ -0,0 +1,275 @@ +.. currentmodule:: machine +.. _machine.CAN: + +class CAN -- controller area network communication bus +====================================================== + +CAN implements the standard CAN communications protocol. At +the physical level it consists of 2 lines: RX and TX. Note that +to connect the microcontroller to a CAN bus you must use a CAN transceiver +to convert the CAN logic signals from the microcontroller to the correct +voltage levels on the bus. + +Example usage (works without anything connected):: + + from machine import CAN + BAUDRATE_500k = 500 + can = CAN(0, extframe=True, mode=CAN.LOOPBACK, baudrate=BAUDRATE_500k) + dev.setfilter(0, CAN.FILTER_ADDRESS, [0x102, 0]) # set a filter to receive messages with id = 0x102 + can.send([1,2,3], 0x102) # send a message with id 123 + can.recv() # receive message + + +Constructors +------------ + +.. class:: machine.CAN(bus, ...) + + Construct a CAN object on the given bus(controller). *bus* can be 0 or 1 for STM32 and 0 for ESP32. + With no additional parameters, the CAN object is created but not + initialised (it has the settings from the last initialisation of + the bus, if any). If extra arguments are given, the bus is initialised. + See :meth:`CAN.init` for parameters of initialisation. + + The physical pins of the CAN bus can be assigned during init. + +Methods +------- + +.. method:: CAN.init(mode, extframe=False, baudrate, prescaler, \*, sjw=1, bs1=6, bs2=8, auto_restart=False) + + Initialise the CAN bus with the given parameters: + + - *mode* is one of: NORMAL, LOOPBACK, SILENT, SILENT_LOOPBACK + - if *extframe* is True then the bus uses extended identifiers in the frames + (29 bits); otherwise it uses standard 11 bit identifiers + - *baudrate* is used to define a standard speed. If it is defined, the *prescaler*, *sjw*, *bs1*, *bs2* + will be ignored. Standard speeds are 25, 50, 100, 125, 250, 500, 1000 + - *prescaler* is used to set the duration of 1 time quanta; the time quanta + will be the input clock divided by the prescaler + - *sjw* is the resynchronisation jump width in units of the time quanta; + it can be 1, 2, 3, 4 + - *bs1* defines the location of the sample point in units of the time quanta; + it can be between 1 and 1024 inclusive + - *bs2* defines the location of the transmit point in units of the time quanta; + it can be between 1 and 16 inclusive + - *tx* defines the gpio used for transmission + - *rx* defines the gpio used for receiving + - *bus_off* defines the gpio used for BUS-OFF signal line(optional) + - *clkout* defines the gpio used for CLKOUT signal line(optional) + - *tx_queue* defines the number of waiting tx messages can be stored + - *rx_queue* defines the number of received messages can be stored + - *auto_restart* sets whether the controller will automatically try and restart + communications after entering the bus-off state; if this is disabled then + :meth:`~CAN.restart()` can be used to leave the bus-off state. + This parameter is currently not implemented and it must be set to False + + +.. method:: CAN.deinit() + + Turn off the CAN bus. + +.. method:: CAN.restart() + + Force a software restart of the CAN controller without resetting its + configuration. + + If the controller enters the bus-off state then it will no longer participate + in bus activity. If the controller is not configured to automatically restart + (see :meth:`~CAN.init()`) then this method can be used to trigger a restart, + and the controller will follow the CAN protocol to leave the bus-off state and + go into the error active state. + +.. method:: CAN.state() + + Return the state of the controller. The return value can be one of: + + - ``CAN.STOPPED`` -- the controller is completely off and reset; + - ``CAN.ERROR_ACTIVE`` -- the controller is on and in the Error Active state + (both TEC and REC are less than 96); + - ``CAN.BUS_OFF`` -- the controller is on but not participating in bus activity + (TEC overflowed beyond 255). + - ``CAN.RECOVERING`` -- the controller is under recover from bus-off state; + + +.. method:: CAN.info([list]) + + Get information about the controller's error states and TX and RX buffers. + If *list* is provided then it should be a list object with at least 8 entries, + which will be filled in with the information. Otherwise a new list will be + created and filled in. In both cases the return value of the method is the + populated list. + + The values in the list are: + + - TEC value + - REC value + - number of times the controller enterted the Error Warning state (wrapped + around to 0 after 65535) - CURRENTLY NOT IMPLEMENTED + - number of times the controller enterted the Error Passive state (wrapped + around to 0 after 65535) - CURRENTLY NOT IMPLEMENTED + - number of times the controller enterted the Bus Off state (wrapped + around to 0 after 65535) - CURRENTLY NOT IMPLEMENTED + - number of pending TX messages + - number of pending RX messages + - Reserved + +.. method:: CAN.setfilter(bank, mode, fifo, params, \*, rtr) + + Configure a filter bank: + + - *bank* is the filter bank that is to be configured (0 for extended, 0 or 1 for standard msg) + - *mode* is the mode the filter should operate in. + - *params* is an array of two values that defines the filter. + The first element will be the id to filter and the second element will be the mask to apply. + mask bit implementation considers 1 as a don't care state and 0 as a check state. + + +-----------------------+----------------------------------------------+ + | *mode* | contents of *params* array | + +=======================+==============================================+ + | CAN.FILTER_RAW_SINGLE | *params* will be copied in hardware variable | + | | and single_filter_mode will be selected | + | | In this mode, *bank* will be ignored | + +-----------------------+----------------------------------------------+ + | CAN.FILTER_RAW_DUAL | *params* will be copied in hardware variable | + | | and single_filter_mode will be cleared | + | | In this mode, *bank* will be ignored | + +-----------------------+----------------------------------------------+ + | CAN.FILTER_ADDRESS | *params* will be set in hardware registers | + | | according to *bank* selection | + +-----------------------+----------------------------------------------+ + + - *rtr* is bool that states if a filter should accept a remote transmission request message. + If this argument is not given then it defaults to ``False``. + +.. method:: CAN.clearfilter(bank) + + Clear and disables all filters + +.. method:: CAN.any(fifo) + + Return ``True`` if any message waiting on the FIFO, else ``False``. + +.. method:: CAN.recv(list=None, \*, timeout=5000) + + Receive data on the bus: + + - *list* is an optional list object to be used as the return value + - *timeout* is the timeout in milliseconds to wait for the receive. + + Return value: A tuple containing four values. + + - The id of the message. + - A boolean that indicates if the message is an RTR message. + - Reserved. + - An array containing the data. + + If *list* is ``None`` then a new tuple will be allocated, as well as a new + bytes object to contain the data (as the fourth element in the tuple). + + If *list* is not ``None`` then it should be a list object with a least four + elements. The fourth element should be a memoryview object which is created + from either a bytearray or an array of type 'B' or 'b', and this array must + have enough room for at least 8 bytes. The list object will then be + populated with the first three return values above, and the memoryview object + will be resized inplace to the size of the data and filled in with that data. + The same list and memoryview objects can be reused in subsequent calls to + this method, providing a way of receiving data without using the heap. + For example:: + + buf = bytearray(8) + lst = [0, 0, 0, memoryview(buf)] + # No heap memory is allocated in the following call + can.recv(lst, timeout=0) + +.. method:: CAN.send(data, id, \*, timeout=0, rtr=False) + + Send a message on the bus: + + - *data* is the data to send (an integer to send, or a buffer object). + - *id* is the id of the message to be sent. + - *timeout* is the timeout in milliseconds to wait for the send. + - *rtr* is a boolean that specifies if the message shall be sent as + a remote transmission request. If *rtr* is True then only the length + of *data* is used to fill in the DLC slot of the frame; the actual + bytes in *data* are unused. + + If timeout is 0 the message is placed in a buffer and the method returns + immediately. If all three buffers are in use an exception is thrown. + If timeout is not 0, the method waits until the message is transmitted. + If the message can't be transmitted within the specified time an exception + is thrown. + + Return value: ``None``. + +.. method:: CAN.clear_tx_queue() + + Clear all messages from transmitting queue. + +.. method:: CAN.clear_rx_queue() + + Clear all messages from receiving queue. + +.. method:: CAN.get_alerts() + + Read the alert status word directly from hardware. + In order to save space in the firmware, the constants for the result decoding are not included on the :mod:`machine.CAN` module. Add the ones that you need from the list below to your program. + + The event codes are:: + + from micropython import const + CAN_ALERT_TX_IDLE = const(0x0001) + CAN_ALERT_TX_SUCCESS = const(0x0002) + CAN_ALERT_BELOW_ERR_WARN = const(0x0004) + CAN_ALERT_ERR_ACTIVE = const(0x0008) + CAN_ALERT_RECOVERY_IN_PROGRESS = const(0x0010) + CAN_ALERT_BUS_RECOVERED = const(0x0020) + CAN_ALERT_ARB_LOST = const(0x0040) + CAN_ALERT_ABOVE_ERR_WARN = const(0x0080) + CAN_ALERT_BUS_ERROR = const(0x0100) + CAN_ALERT_TX_FAILED = const(0x0200) + CAN_ALERT_RX_QUEUE_FULL = const(0x0400) + CAN_ALERT_ERR_PASS = const(0x0800) + CAN_ALERT_BUS_OFF = const(0x1000) + + +Constants +--------- + +.. data:: CAN.NORMAL + CAN.LOOPBACK + CAN.SILENT + CAN.SILENT_LOOPBACK + CAN.LISTEN_ONLY + + + The mode of the CAN bus used in :meth:`~CAN.init()`. + + +---------------------+---------------------------------------------+-------+-------+ + | *mode* | \ | STM32 | ESP32 | + +=====================+=============================================+=======+=======+ + | CAN.NORMAL | .. image:: img/can_mode_normal.png | + | + | + +---------------------+---------------------------------------------+-------+-------+ + | CAN.LOOPBACK | .. image:: img/can_mode_loopback.png | + | + | + +---------------------+---------------------------------------------+-------+-------+ + | CAN.SILENT | .. image:: img/can_mode_silent.png | + | + | + +---------------------+---------------------------------------------+-------+-------+ + | CAN.SILENT_LOOPBACK | .. image:: img/can_mode_silent_loopback.png | + | | + +---------------------+---------------------------------------------+-------+-------+ + | CAN.LISTEN_ONLY | .. image:: img/can_mode_listen_only.png | | + | + +---------------------+---------------------------------------------+-------+-------+ + + +.. data:: CAN.STOPPED + CAN.ERROR_ACTIVE + CAN.BUS_OFF + CAN.RECOVERING + + Possible states of the CAN controller returned from :meth:`~CAN.state()`. + +.. data:: CAN.FILTER_RAW_SINGLE + CAN.FILTER_RAW_DUAL + CAN.FILTER_ADDRESS + + The operation mode of a filter used in :meth:`~CAN.setfilter()`. + diff --git a/docs/library/machine.rst b/docs/library/machine.rst index 3f5cd6f13c..33407f587c 100644 --- a/docs/library/machine.rst +++ b/docs/library/machine.rst @@ -256,6 +256,7 @@ Classes machine.ADC.rst machine.ADCBlock.rst machine.PWM.rst + machine.CAN.rst machine.UART.rst machine.SPI.rst machine.I2C.rst