• Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

Thứ Bảy, 1 tháng 7, 2017

[CAN2.0][Controller Area Network][Bài 12] Lọc thông điệp trong giao thức CAN

1. Lọc thông điệp

Việc lọc thông điệp thực hiện trên các thông điệp được nhận bởi Node. Một Node lọc thông điệp để biết nó có phải là thông điệp của nó hay không.

Việc lọc thông điệp thực hiện trên toàn bộ vùng ID (Identifier) của thồn điệp. Việc lọc thông điệp là sự so sánh giữa ID thông điệp với một hoặc nhiều giá trị ID được cấu hình bên trong một Node.

Mỗi bit được so sánh có thể được che bởi các thanh ghi mặt nạ (mask register) để thiết lập bit này là don't care, tức là không quan tâm đến giá trị bit này là bao nhiêu khi so sánh. Các bit của thanh ghi mặt nạ phải lập trình được. Độ dài của thanh ghi mặt nạ có thể bằng độ dài của toàn bộ vùng ID hoặc chỉ bằng một phần vùng này.

Sau đây là một ví dụ về việc lọc thông điệp được thực hiện trong chip CAN controller mcp2515 của Microchip. Từng bit ID của thông điệp nhận được (Message Assembly Buffer Identifier) sẽ được so sánh với Thanh ghi lưu giá trị ID được chấp nhận (Acceptance Filter register) bằng cổng XOR. Nếu giá trị giống nhau, ngõ ra cồng XOR là 0; nếu khác nhau thì ngõ ra cổng XOR là 1. Giá trị này được lấy bù để OR với giá trị bù của của các bit thanh ghi mặt nạ (Acceptance Mask register). Nếu tất cả các ngõ ra cổng OR là 1 thì tín hiệu báo thông điệp hợp lệ với Node (RxRqst) sẽ tích cực. Nếu 1 hoặc nhiều ngõ ra cổng OR bằng 0, nghĩa là có 1 hoặc nhiều bit ID không phù hợp với cấu hình của Node thì RxRqst sẽ không tích cự và Node không nhận thông điệp này.
Hình 1. Cấu tạo thành phần lọc thông điệp của chip CAN controller mcp2515 của Microchip
Đối với mạch nguyên lý trên, nếu bit thanh ghi mặt nạ bằng 0 thì giá trị so sánh tại vị trí đó, ngõ ra cổng XOR, sẽ là don’t care và giá trị bit ID tại vị trí này luôn phù hợp cho dù là 0 hay 1.
Hình 2. Bảng giá trị minh họa mối liên hệ giữa bit mặt nạ (Mask), bit cấu hình lọc IC (Filter) và giá trị bit ID của thông điệp

Việc sử dụng thanh ghi mặt nạ cho phép một Node có thể được cấu hình 1 khoảng giá trị ID thay vì từng giá trị đơn lẻ. Theo mạch nguyên lý đã trình bày trên đây, với 29 bit ID, giả sử các giá trị cấu hình là:
  • Thanh ghi lưu các bit Filter: h0000_005A
  • Thanh ghi lưu các bit Mask: hFFFF_FFF0
thì khoảng giá trị ID mà Node sẽ nhận là từ h0000_0050 đến h0000_005F.

2. Minh họa việc truyền nhận thông điệp trên bus CAN 

Giả sử ta có bốn Node CAN như sau: 
  • Node 1: muốn truyền dữ liệu với IDENTIFIER 01101000110 (838). 
  • Node 2: muốn truyền một dữ liệu khác với IDENTIFIER 01101001000 (840) và cho phép chỉ nhận dữ liệu với IDENTIFIER 01101000110 (838). 
  • Node 3: không truyền dữ liệu nào và có khoảng ID cho phép là 0110100xxxx (‘x’ hiểu là don't care, tức tầm giá trị của khoảng cho phép là [832; 847]). 
  • Node 4: muốn truyền dữ liệu có IDENTIFIER 01110010010 (914) và cho phép nhận ID là 0111001xxx1 (tức tầm của khoảng ID cho phép là các số lẻ trong đoạn [913; 927]) 
Giả sử, Node 1, Node 2, Node 4 cùng truyền dữ liệu của mình trong cùng một thời gian. Như vậy, cả 3 Node sẽ chuyển từ trạng thái Idle thành bộ truyền và sự xung đột sẽ xuất hiện nên trên bus sẽ xảy ra sự phân xử.
Hình 3. Sự phân xử khi truyền thông điệp trên bus CAN

Sự phân xử thực hiện như sau, ở ba bit đầu tiên, cả 3 Node đều truyền cùng mức và giá trị bus ở vị trí tương ứng cũng vậy. Đến bit thứ 4, Node 1 và Node 2 truyền dominant nên giá trị bus theo ‘AND-wire’ là dominant. Cùng lúc này, node 4 truyền recessive nhưng khi giám sát bus lại thấy là dominant, nó hiểu là có nút khác cũng đang truyền dữ liệu. Node 4 sẽ ngưng truyền và trở thành bộ nhận. Ta nói rằng nút 4 thua trong sự phân xử. Tương tự như vậy, đến bit thứ 8, Node 2 cũng thua trong sự phân xử và trở thành bộ nhận. 

Kết quả của cuối cùng của trình phân xử trên là chỉ có Node 1 truyền dữ liệu với IDENTIFIER 838 của nó trên bus và nó là bộ truyền cho đến khi bus Idle. Các Node còn lại đều trở thành bộ nhận dữ liệu từ Node 1. Trong 3 Node nhận là Node 2, Node 3, Node 4 thì Node 4 sẽ không nhận dữ liệu này vì 838 không thuộc khoảng ID [913; 927] mà nó được cấu hình. Node 2 và Node 3 sẽ cho phép dữ liệu qua lớp phụ LLC để lên lớp cao hơn.
Hình 3. Hoạt động truyền nhận của các Node trong bus CAN


Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

[CANFD][Controller Area Network][Bài 3] CANFD - Sự khác nhau giữa CAN FD và CAN 2.0 - phần 3

Tham khảo: CAN with Flexible Data-Rate Specification Version 1.0 (released April 17th, 2012) by BOSCH

Nội dung phần này chỉ nói về điểm khác biệt của CAN FD so với CAN Specification 2.0 (CAN 2.0). Bạn đọc hãy tham khảo về CAN2.0 trước khi đọc bài này.

1. Luật chèn Bit (Stuffing)

Khác với CAN 2.0, luật chèn bit áp dụng cho các vùng từ SOF đến CRC Sequence. Định dạng khung truyền CAN FD có sự thay đổi về luật chèn bit cho vùng CRC Sequence. Các bit được chèn thêm ở vùng này chỉ nằm ở các vị trí cố định.

Một bit cố định được chèn ở trước bit đầu tiên của CRC Sequence cho dù các bit cuối cùng của vùng trước đó chưa đáp ứng đúng theo điều kiện của luật chèn bit, nghĩa là chưa xuất hiện 5 bit cùng mức logic liên tiếp nhau. Sau đó, mỗi bit chèn sẽ được thêm sau mỗi nhóm 4 bit của chuỗi CRC Sequence. Giá trị của bit chèn là đảo của giá trị bit đứng ngay trước nó.

Bộ nhận sẽ bỏ qua các bit chèn khi nhận CRC. Bộ nhận sẽ phát hiện ra lỗi chèn bit (Stuff Error) nếu phát hiện ra bit được chèn có giá trị giống giá trị bit ngay trước nó. Số bit chèn cố định trong CRC định dạng CAN FD bằng với số tối đa của các bit chèn khi áp dụng luật chèn bit của định dạng CAN (5 bit cùng mức thì chèn 1 bit đảo).

Hình 1. So sánh số bit chèn trên CRC15 giữa CAN FD và một trường hợp chèn tối đa theo luật chèn bit CAN 2.0

2. Các loại lỗi

Các loại lỗi được phát hiện trong CAN FD tương tự như CAN 2.0 nhưng lỗi định dạng (Form Error) bổ sung thêm lỗi khi phát hiện lỗi ở bit chèn cố định của vùng CRC Sequence.

3. Quy định về thời gian bit

Do các khung truyền định dạng CAN FD có thể hỗ trợ 2 tốc độ bit khác nhau, 1 cho pha phân xử (Arbitration phase) và 1 cho pha dữ liệu (Data phase), nên trong phần cứng CAN controller sẽ có 2 bộ thanh ghi cấu hình về thời gian bit cho 2 tốc độ này.

Tương tự CAN 2.0, thời gian của một bit vẫn luôn gồm 4 đoạn là Sync_seg, Prop_seg, Phase_seg1 và Phase_seg2. Điểm lấy mẫu (sample point) vẫn ở cuối Phase_seg1. Nhưng vì CAN FD hỗ trợ 2 tốc độ bit nên định nghĩa thêm thuật ngữ để phân biệt 2 tốc độ bit này.

Thời gian bit danh định (Nominal Bit Time) là khái niệm dành cho pha phân xử. Đối với pha dữ liệu thì thời gian lý tưởng của 1 bit gọi là thời gian bit dữ liệu (Data Bit Time).

TIME QUANTUM(N) = m(N) * MINIMUM TIME QUANTUM

TIME QUANTUM(D) = m(D) * MINIMUM TIME QUANTUM
  • MINIMUM TIME QUANTUM (TQ tối thiểu): là giá trị thời gian tối thiểu được chia từ xung clock cấp cho CAN controller
  • m: là giá trị của bộ đếm số TQ tối thiểu
  • TQ: Thời gian dùng để tính độ dài 1 bit

Như vậy, độ dài đơn vị thời gian TQ của pha phân xử TQ(N) và pha dữ liệu TQ(D) có thể khác hoặc bằng nhau.

Tương tự, tốc độ bit danh định (Norminal Bit Rate) dùng để nói về tốc độ bit của pha phân xử ở CAN FD còn đối với pha dữ liệu, tốc độ này được gọi là tốc độ bit dữ liệu (Data Bit Rate).

Đối với tốc độ bit danh định, độ dài các đoạn thời gian của một bit được quy định như sau:

  • Sync_seg:     1 TQ(N)
  • Prop_seg:     1 đến 32 TQ(N)
  • Phase_seg1: 1 đến 32 TQ(N)
  • Phase_seg2:  max(Phase_seg1, Thời gian lan truyền thông tin IPT)
Đối với tốc độ bit dữ liệu, độ dài các đoạn thời gian của 1 bit giống quy định của chuẩn CAN 2.0 như sau:
  • Sync_seg:     1 TQ(D)
  • Prop_seg:     1 đến 8 TQ(D)
  • Phase_seg1: 1 đến 8 TQ(D)
  • Phase_seg2:  max(Phase_seg1, Thời gian lan truyền thông tin IPT)


Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

[CANFD][Controller Area Network][Bài 2] CANFD - Sự khác nhau giữa CAN FD và CAN 2.0 - phần 2

Tham khảo: CAN with Flexible Data-Rate Specification Version 1.0 (released April 17th, 2012) by BOSCH

Nội dung phần này chỉ nói về điểm khác biệt của CAN FD so với CAN Specification 2.0 (CAN 2.0). Bạn đọc hãy tham khảo về CAN2.0 trước khi đọc bài này.

1. Tính nhất quán của dữ liệu
Cấu trúc phân lớp của CAN FD theo mô hình tham khảo OSI.
Hình 1. Cấu trúc phân lớp của CAN FD trong mô hình tham khảo OSI

Tính nhất quán của dữ liệu được thể hiện qua việc dữ liệu được đảm bảo đồng nhất khi truyền qua các lớp này. Đồng nhất (consistency) được hiểu là dữ liệu được phát đi là dữ liệu đúng, đủ và kịp thời như mong muốn.

Như đã trình bày ở các bài cấu trúc phân lớp của CAN, CAN controller là thành phần sẽ thực hiện các xử lý ở lớp LLC (Logical Link Control) và lớp MAC (Medium Access Control).

Trong một Node, các thông điệp để truyền được chuẩn bị trước bởi host, host ở đây là đơn vị điều khiển chính của Node, có thể là CPU, FPGA,... Các thông điệp này được chuyển đến lớp phụ LLC (Logical Link Control) thông qua giao tiếp giữa host và thành phần CAN controller để đến lớp phụ MAC (Medium Access Control). Lớp MAC chịu trách nhiệm tạo ra khung thông điệp theo đúng chuẩn. Nếu host và CAN controller là 2 chip độc lập thì giao tiếp giữa chúng có thể là SPI, UART, parallel port,… Nếu CAN controller được tích hợp trong một MCU thì giao tiếp giữa chúng là giao tiếp nội thông qua bus hệ thống như APB, AHB, AXI, …

Các thông điệp có thể được lưu trữ trong một bộ nhớ được chia sẻ (shared memory), ví dụ như RAM. Việc truy xuất dữ liệu từ RAM có thể làm sai dữ liệu nên cần có cơ chế để đảm bảo tính đúng đắn của dữ liệu cần truyền lấy từ RAM. Tính đồng nhất của các thông điệp được truyền lấy từ một bộ nhớ được chia sẻ phải được đảm bảo bởi ít nhất bằng một trong 2 cách sau:
  • Lớp MAC sẽ lưu trữ toàn bộ thông điệp được truyền đi trong một bộ đệm tạm trước khi bắt đầu truyền. Nghĩa là, dữ liệu đúng đã được chứa đầy đủ tại lớp MAC sẵn sàng cho việc truyền.
  • Lớp LLC sẽ kiểm tra các lỗi dữ liệu trong khi thông điệp được gửi đến lớp MAC. Nếu lỗi xuất hiện, thông điệp sẽ không được truyền. Nếu một lỗi được phát hiện khi việc truyền đã bắt đầu thì Node phải được chuyển sang chế độ giám sát bus (Bus Monitoring Mode) và các Node nhận sẽ không thể thấy được một thông điệp hợp lệ để nhận.

Lỗi dữ liệu được nhắc đến ở bên trên có thể là lỗi parity khi kiểm tra dữ liệu đọc ra từ RAM, lỗi không cung cấp dữ liệu kịp thời cho CAN controller xử lý, hoặc một phần dữ liệu đã được cập nhật mới trong khi đang truyền, …

Có thể thấy, CAN FD làm rõ hơn vấn đề thực thi ở phần cứng CAN controller với những quy định cụ thể về kiểm soát tính đồng nhất khi truyền dữ liệu.

2. Các trạng thái hoạt động

Một Node CAN FD có bốn trạng thái hoạt động là Integrating (trạng thái chờ tích hợp), Idle (Rảnh), Receiver (Nhận) và Transmitter (Truyền). Việc quy định về bốn trạng thái hoạt động không xung đột với chuẩn CAN 2.0 mà chỉ làm rõ hơn hoạt động cơ bản của một Node.

Integrating là trạng thái chờ tích hợp. Việc gọi là chờ tích hợp vì đây là trạng thái mà một Node chờ để phát hiện chuỗi có 11 bit recessive liên tiếp sau khi Node này được khởi động hoặc Node này đang trong quá trình khôi phục hoạt động từ bus-off sang Idle.

Sau khi một Node mới được khởi động, hoặc khởi động lại (reset) hoặc được cấu hình bởi host để khơi động lạ thì nó không tham gia ngay vào các hoạt động trên mạng mà cần thời gian để đồng bộ với các hoạt động trên mạng, Node phải chờ sai khi phát hiện được một chuỗi 11 bit recessive liên tiếp thì mới bắt đầu tham gia vào hoạt động của mạng. Quy định 11 bit recessive liên tiếp đảm bảo lúc này bus CAN đã IDLE. Xem lại cấu trúc các khung của CAN, phần khung có kết thúc dài nhất là khung báo lỗi hoặc báo quá tải với 8 bit recessive. Trường hợp xấu nhất là ngay sau đó là khoảng liên khung với độ dài phần Intermission là 3 bit recessive. Như vậy, việc chờ 11 bit recessive sẽ đảm bảo bus đang IDLE. Chú ý, phần Suspend Transmission của khoảng liên khung chỉ dành cho bộ truyền đang trong trạng thái lỗi bị động nên một Node mới khởi động.
Hình 2. Giải thích trường hợp Node phải chờ 11 bit recessive trước khi tham gia hoạt động của bus

Một Node đang hoạt động trên bus khi rơi vào trạng thái bus-off thì phải giám sát bus cho đến khi phát hiện được 128 chuỗi 11 bit recessive thì mới được tham gia trở lại vào hoạt động của bus.

Idle là trạng thái rảnh. Node trong trạng thái này sẵn sàng truyền hoặc nhận SOF. Node sẽ chuyển từ trạng thái này sang trạng thái là bộ truyền (Transmitter) hoặc nhận (Receiver).

Receiver là trạng thái Node phát hiện hoạt động trên bus CAN ví dụ như SOF nhưng nó không đang truyền bất cứ thông điệp nào.

Transmitter là trạng thái mà Node khởi tạo truyền thông điệp trên bus. Node sẽ giữ trạng thái này cho đến khi nó thua phân xử hoặc đến khi bus Idle.
Hình 3. Các trạng thái hoạt động cơ bản của một Node CAN FD


Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

Thứ Ba, 27 tháng 6, 2017

[CANFD][Controller Area Network][Bài 1] CANFD - Sự khác nhau giữa CAN FD và CAN 2.0 - phần 1

Tham khảo: CAN with Flexible Data-Rate Specification Version 1.0 (released April 17th, 2012) by BOSCH

Nội dung phần này chỉ nói về điểm khác biệt của CAN FD so với CAN Specification 2.0 (CAN 2.0). Bạn đọc hãy tham khảo về CAN2.0 trước khi đọc bài này.

1. CAN FD là gì?

CAN FD như tên gọi là giao thức CAN với tốc độ dữ liệu linh động. Đây có thể xem là một giao thức mở rộng của giao thức CAN.

Việc ngày càng nhiều ứng dụng sử dụng các giao thức truyền thông nối tiếp dẫn đến nhu cầu bằng thông sử dụng trong giao thức CAN ngày càng tăng. Giao thức CAN truyền thống (CAN Specification 2.0) khó đáp ứng được trong một số ứng dụng nhất định. Để tăng khả năng sử dụng của giao thức CAN, CAN FD ra đời cho phép tốc độ truyền dữ cao hơn 1Mbit/s và số byte dữ liệu nhiều hơn 8 byte trong một khung truyền dữ liệu.

CAN FD sử dụng chung lớp vật lý với giao thức CAN quy định trong CAN Specification 2.0 (CAN 2.0).

Định dạng khung truyền của CAN FD khác với CAN 2.0. Nó có thêm 2 bit điều khiển mới. Một bit cho phép định dạng khung truyền với mã độ dài dữ liệu (DLC) mới và một bit cho phép tùy chọn chuyển sang tốc độ bit nhanh hơn sau khi sự phân xử đã được thực hiện xong.

Các đa thức CRC mới cùng được giới thiệu để đảm bảo cho các khung CAN FD dài hơn với khoảng cách Hamming giống như giao thức CAN đã chứng minh.

Định dạng khung CAN FD được định nghĩa để có thể cùng hoạt động với định dạng CAN 2.0 trong cùng một mạng. Giao thức CAN 2.0 vẫn hợp lệ và không có bất cứ điều chỉnh nào như một giao thức độc lập. Việc hai giao thức CAN 2.0 và CAN FD có thể cùng tồn tại trong một mạng được đảm bảo bởi yêu cầu là một thành phần CAN FD được xây dựng buộc phải tương thích với cả CAN FD và CAN 2.0.

Bên cạnh đó, để tương thích với CAN FD thì một thành phần CAN FD được xây dựng phải tương thích với mô tả của chuẩn CAN FD và với ISO 11898-1.

Chú ý: CAN FD có thể giao tiếp với CAN 2.0 miễn là không sử dụng định dạng khung của CAN FD. Nghĩa là, sử dụng định dạng khung của CAN 2.0.

2. Định dạng khung truyền

Chuẩn CAN FD quy định 4 định dạng khung truyền là:

  • (1) Định dạng CAN cơ bản (CAN Base Format): 11 bit ID + tốc độ bit hằng
  • (2) Định dạng CAN mở rộng (CAN Extended Format): 29 bit ID + tốc độ bit hằng
  • (3) Định dạng CAN FD cơ bản (CAN FD Base Format): 11 bit ID + tốc độ bit kép
  • (4) Định dạng CAN FD mở rộng (CAN FD Extended Format): 29 bit ID + tốc độ bit kép
Từ đây về sau, khi nói đến định dạng CAN thì đó là CAN 2.0. 

Tốc độ bit hằng tốc độ bit không thay đổi trong suốt quá trình truyền thông điệp. Tốc độ bit kép là trong một khung truyền Node CAN có thể truyền 2 tốc độ bit khác nhau.

Định dạng (1) và (2) như định dạng chuẩn (Standard Format) và định dạng mở rộng (Extended Format) của CAN 2.0.

3. Loại khung truyền

CAN FD có 4 loại khung truyền như CAN 2.0 là khung dữ liệu, khung yêu cầu, khung báo lỗi và khung báo quá tải. CAN FD khác CAN 2.0 ở các điểm sau:

Ngoài 2 định dạng "CAN cơ bản" và "CAN mở rộng" như CAN 2.0, khung dữ liệu có thêm 2 dạng:

  • Khung dữ liệu dạng CAN FD cơ bản
  • Khung dữ liệu dạng CAN FD mở rộng
Khung yêu cầu chỉ có hai định dạng như CAN 2.0 chứ không có định dạng CAN FD cơ bản hay CAN FD mở rộng.

Khung báo quá tải ngoài chức năng tạo thêm trễ giữa các khugn dữ liệu và khung yêu cầu thì còn thêm chức năng "đồng bộ sự phát hiện trạng thái bus rảng - IDLE".

4. Cấu tạo khung dữ liệu

Cấu tạo của loại khung này tạo nên sự khác biệt giữa CAN FD và CAN 2.0. Khác biệt ở đây được hiểu là sự mở rộng của CAN FD so với CAN 2.0 chứ không phải đối lập.

4.1 Khung dữ liệu

a) Vùng phân xử:

Vị trí bit RTR (Remote Transmission Request) dùng để xác định khung dữ liệu (dominant) hoặc khung yêu cầu (recessive) chỉ dành cho định dạng CAN cơ bản, nó tương ứng với định dạng khung chuẩn - Standard Format của CAN 2.0.

Với CAN FD cơ bản, bit RTR chuyển thành bit r1 và luôn là bit dominant. Điều này tương ứng với việc định dạng CAN FD chỉ dành cho khung dữ liệu, không dành cho khung yêu cầu.
b) Vùng điều khiển:

Vùng điều khiển của định dạng CAN FD có cấu tạo rất khác so với CAN 2.0

CAN FD có thêm 3 bit mới là:
  • EDL (Extended Data Length) là bit recessive. Đây là bit cho phép độ dài dữ liệu mở rộng. Bit này dùng để phân bit dữ định dạng khung CAN 2.0 và CAN FD.
  • BRS (Baud Rate Switch) là bit dùng để quyết định việc thay đổi tốc độ bit trong định dạng CAN FD. Nếu bit này là recessive thì sau "pha phân xử" (Arbitration Phase), tốc độ bit hiện tại sẽ được chuyển thành một tốc độ bit khác đã được cấu hình trước, tốc độ bit mới được dùng cho pha dữ liệu (Data Phase). Chú ý, ở CAN FD, có thêm 2 khái niệm mới là pha phân xử và pha dữ liệu. Hai khái niệm này khác với hai khái niệm "vùng phần xử" (Arbitration Field) và vùng dữ liệu (Data Field).
  • ESI (Error State Indicator) là cờ chỉ trạng thái lỗi được truyền là dominant nếu Node đang trong trạng thái tích cực với lỗi (Active Error) và truyền là recessive nếu Node đang trong trạng thái lỗi bị động (Passive Error)
Hình 1. So sánh giữa vùng phân xử và vùng điều khiển trong khung dữ liệu của CAN 2.0 định dạng cơ bản và CAN FD định dạng cơ bản
Hình 2. So sánh giữa vùng phân xử và vùng điều khiển trong khung dữ liệu của CAN 2.0 định dạng mở rộng và CAN FD định dạng mở rộng

Với bit SRR, CAN FD cho phép Node là bộ nhận cho phép bit SRR là dominant. Điều này không được nhắc đến trong CAN 2.0.
Bốn bit độ dài dữ liệu DLC trong CAN FD được mở rộng thêm. Trong khi CAN 2.0 chỉ sử dụng các giá trị từ 0 đến 8 tương ứng từ 0 đến 8 byte dữ liệu, DLC lớn hơn 8 cũng được xem như là 8 byte, thì CAN FD sử dụng các giá trị từ 9 đến 15 để tăng số byte vùng dữ liệu lên đến 64 byte cho phép truyền được nhiều dữ liệu hơn trong 1 lần phát.
Hình 2. Bảng mã DLC của CAN 2.0 và CAN FD
c) Vùng dữ liệu
Định dạng CAN FD cho phép tối đa có thể lên đến 64 byte.

d) Vùng CRC:

Vì độ dài vùng dữ liệu tăng lên nên tương ứng vùng CRC cũng được điều chỉnh lại cho phù hợp

Vùng CRC không có độ dài cố định như CAN 2.0 mà thay đổi tùy theo độ dài vùng dữ liệu. Cụ thể:
  • Khung theo định dạng CAN sẽ dùng CRC_15 có đa thức sinh như chuẩn CAN 2.0 => độ dài CRC SEQUENCE là 15 bit
  • Khung theo định dạng CAN FD có độ dài từ 16 byte trở xuống sử dụng CRC_17 => độ dài CRC SEQUENCE là 17 bit
  • Khung theo định dạng CSN FD có độ dài trên 16 byte sẽ sử dụng CRC_21 => độ dài CRC SEQUENCE là 21 bit
Hình 3. Các đa thức dinh trong chuẩn CAN FD
Mỗi đa thức sinh đều cho khoảng cách mã Hamming HD = 6.

Tại thời điểm bắt đầu của một khung, tất cả các Node đều phải tính cả 3 loại CRC cùng lúc, kể cả bộ truyền dữ liệu. Một Node thắng phân xử sẽ chọn CRC phù hợp với cấu hình  bit EDL và độ dài dữ liệu DLC của khung truyền. Các bộ nhận cũng sẽ dựa trên thông tin của khung truyền để chọn và kiểm tra CRC phù hợp.

Trong định dạng CAN FD, CRC được tính cho chuỗi bit đã được áp dụng luật chèn bit. Đây là điểm khác biệt so với định dạng CAN vì CRC của định dạng này không bao gồm các bit chèn.

Đoạn mã giả minh họa việc tính CRC như sau:
CRC_RG = 0; // initialize shift register
REPEAT
CRCNXT = NXTBIT EXOR CRC_RG(nCRC-1);
CRC_RG(nCRC-1:1) = CRC_RG(nCRC-2:0); // shift left by 1 position
CRC_RG(0) = 0;
IF CRCNXT THEN
CRC_RG(nCRC-1:0) = CRC_RG(nCRC-1:0) EXOR (CRC polynomial);
ENDIF
UNTIL (CRC SEQUENCE starts or there is an ERROR condition)
CRC Delimiter chỉ là 1 bit recessive đối với định dạng CAN nhưng nó có thể là 1 hoặc 2 bit recessive trong định dạng CAN FD. Cụ thể, trong định dạng CAN FD, bộ truyền chỉ truyền 1 bit recessive nhưng phải chấp nhận có 2 bit recessive trước khi phát hiện cạnh từ recessive chuyển sang dominant của ACK SLOT. Một bộ nhận sẽ vẫn gửi ACK của nó sau bit recessive đầu tiên của CRC Delimiter.
Hình 4. vùng CRC

Chú ý: CAN FD controller, bộ điều khiển thực hiện giao thức CAN FD, chuyển từ pha dữ liệu trở lại pha phân xử khi đên điểm lấy mẫu bit đầu tiên của CRC Delimiter

e) Vùng ACK
Hình 5. Vùng ACK
Định dạng CAN FD chấp nhận vùng ACK SLOT có độ dài tói đa 2 bit để bù sự dịch pha giữa các bộ nhận trong khi định dạng CAN chỉ chấp nhận 1 bit ACK và coi bit ACK thứ 2 là một lỗi định dạng.

ACK Delimiter cũng được tăng lên 2 bit recessive trong định dạng CAN FD.

5. Pha phân xử và pha dữ liệu

Đây là hai khái niệm mới trong CAN FD. Trong đó:
  • Pha dữ liệu (Data Phase) được tính từ điểm lấy mẫu được bit BRS (Bit Rate Switch) đến điểm lấy mẫu được bit đầu tiên của CRC Delimiter. Đây là vùng sẽ được chuyển sang tốc độ bit khác nếu bit BRS là recessive
  • Pha phân xử (Arbitration Phase) là các vùng còn lại, bao gồm từ SÒ đến điểm lấy mẫu bit BRS và từ điểm lấy mẫu bit đầu tiên của CRC Delimiter đến kết thúc khung.
*Xem lại các hình mình họa phía trên để hình dung rõ hơn về các pha này

6. Cấu tạo khung yêu cầu

 Tương tự CAN 2.0

7. Cấu tạo khung báo lỗi và báo quá tải

Tương tự CAN 2.0

8. Cấu tạo khoảng liên khung

Tương tự CAN 2.0

(Các điểm khác biệt khác sẽ được trình bày tiếp trong phần 2)


Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

Chủ Nhật, 25 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 11] Ví dụ về quan sát một bus CAN thực tế bằng dao động ký


Tham khảo: Introduction to the Controller Area Network (CAN), Application Report, TI

Nội dung bài này tham khảo từ một kết quả đo đạc của TI nhằm cho bạn đọc có cái nhìn cụ thể về sự truyền nhận dữ liệu trên 1 bus CAN và quan sát hoạt động 1 bus CAN trên thực tế.

Chuẩn CAN định nghĩa một giao thức mạng thông tin cho phép tất cả các Node trong mạng có thể thông tin được với nhau. Mạng có thể có hoặc không có Node điều khiển trung tâm. Các Node có thể được thêm vào mạng bất kỳ lúc nào kể cả lúc mạng đang hoạt động (hot-plugging).

Việc quan sát được thực hiện trên:
  1. Bus CAN ở Ch 1 sử dụng đầu đo vi sai
  2. Đường TX của Node A, nối từ vi xử lý DSP có tích hợp CAN controller đến CAN transceiver, ở Ch 2
  3. Đường TX của Node B, nối từ vi xử lý DSP có tích hợp CAN controller đến CAN transceiver, ở Ch 3
  4. Đường TX của Node C, nối từ vi xử lý DSP có tích hợp CAN controller đến CAN transceiver, ở Ch 4
Hình 1. Minh họa bus CAN được kết nối và đo đạc bằng dao động ký

Đầu tiên Node A truyền một thông điệp hợp lệ và được Node B và C xác nhận bằng 1 bit dominant ở vùng ACK slot. Sau đó, Node B và Node C cùng phát thông điệp. Sự xung đột xảy ra và Node C thắng phân xử nên truyền tiếp cho đến khi kết thúc thông điệp của nó. Node B ngừng truyền ngay khi thua phân xử và trở thành bộ nhận. Sau đó, cả Node A và Node B đều phát ACK báo hiệu Node C truyền một thông điệp hợp lệ. Cuối cùng, Node B phát lại thông điệp của nó khi bus rảnh và được Node A và Node C báo ACK.

Chú ý, cực của dạng sóng trên bus đo bằng đầu dò vi sai ở hình sau ngược với dạng sóng đo trên các đường TX, đồng thời cũng là ngõ vào bộ lái bus CAN của CAN transceiver.
Hình 2. Dạng sóng thể hiện trên dao động ký của bus CAN

Thứ Bảy, 24 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 10] Quy định về đồng bộ trong bus CAN

1. Đồng bộ cứng - Hard Synchronization

Đồng bộ cứng làm cho thời gian bit đang được giám sát tại một Node CAN khởi động lại vị trí Sync_seg.

Đồng bộ cứng xảy ra khi có cạnh bit, cạnh lên hoặc cạnh xuống. Như vậy, một cạnh bit xuất hiện sẽ làm việc tính toán thời gian bit của một Node khởi động lại về Sync_seg.

Khi Node phát hiện cạnh xuống của SOF trên đường truyền, Node bắt đầu tính toán thời gian bit bắt đầu từ Sync_seg.
Hình 1. Các phân đoạn của 1 bit
2. Độ rộng bước tái đồng bộ - Resynchronization Jump Width

Như đã trình bày về định thời bit, độ dài đoạn Phase_seg1 và Phase_seg2 không cố định mà Phase_seg1 có thể bị kéo dài và Phase_seg2 có thể bị rút ngắn trong quá trình một Node hoạt động.

Độ rộng bước tái đông bộ (RJW hoặc SJW) sẽ quy định đố lớn của đoạn được kéo dài hoặc rút ngắn. RJW có thể được lập trình trong khoảng từ 1 đến Min(4, Phase_seg1).

3. Lỗi pha của một cạnh bit - Phase Error

Lỗi pha của một cạnh, cạnh lên hoặc cạnh xuống, được xác định bởi vị trí của cạnh bit so với đoạn Sync_seg. Lỗi pha được đo bằng đơn vị TQ. Ký hiệu lỗi pha được quy định như sau:

  • e = 0: cạnh bit xuất hiện trong vùng Sync_seg và không xảy ra lỗi pha
  • e > 0: cạnh bit xuất hiện sau Sync_seg và trước điểm lấy mẫu (Sample point) gọi là lỗi pha dương
  • e < 0: cạnh bit xuất hiện sau điểm lấy mẫu và trước Sync_seg của bit tiếp theo gọi là lỗi pha âm


Hình 2. Vị trí xác định lỗi pha của cạnh bit
Như vậy việc xác định lỗi pha chỉ khi có sự xuất hiện cạnh bit. Việc truyền liên tiếp nhiều bit cùng mức logic sẽ không xác định được lỗi pha. Mỗi Node đều giám sát thời gian từng bit được truyền trên bus. Khi một cạnh bit xuất hiện. Một Node sẽ kiểm tra xem cạnh này rơi vào đoạn thời gian nào của bit mà nó đang giám sát. Từ đó, nó xác định có lỗi pha hay không.

CAN truyền theo dạng NRZ nên việc truyền nhiều bit cùng mức logic liên tiếp sẽ có thể gây ra mất đồng bộ dẫn đến việc nhận dữ liệu bị sai. Vì vậy, chuẩn CAN đã quy định về việc chèn bit để giải quyết vấn đề này. Việc chèn một bit trái dấu sẽ làm các Node đang nhận đồng bộ lại việc tính toán thời gian bit của chúng.

4. Tái đồng bộ - Resynchronization

Sự tái đồng bộ chỉ có thể xảy ra khi xuất hiện cạnh bit. Sự tái đồng bộ xảy ra như đồng bộ cứng (hard synchronization) nếu lớn lỗi pha có xảy ra nhưng độ lớn lỗi pha nhỏ hơn hoặc bằng độ rộng bước tái đồng bộ RJW.
Nếu độ lớn lỗi pha lớn hơn RJW thì việc tái đồng bộ được thực hiện như sau:

  • Nếu lỗi pha dương thì Phase_seg1 được kéo dài thêm một đoạn đúng bằng RJW.
  • Nếu lỗi pha âm thì Phase_seg2 được rút ngắn một đoạn đúng bằng RJW
5. Quy luật đồng bộ - Synchronization rules

Đồng bộ cứng và Tái đồng bộ là hai dạng của sự đồng bộ. Chúng tuân theo quy luật sau đây:
  1. Chỉ một quy luật đồng bộ được áp dụng cho một bit. Một bit nếu đã áp dụng đồng bộ cứng thì không áp dụng tái đồng bộ.
  2. Sự đồng bộ chỉ áp dụng cho một cạnh nếu giá trị được phát hiện tại điểm lấy mẫu trước đó (giá trị bus được đọc trước đó) khác giá trị bus ngay sau cạnh bit.
  3. Đồng bộ cứng xảy ra khi xuất hiện cạnh chuyển từ bit recessive sang bit dominant khi bus IDLE. Như vậy, việc xuất hiện cạnh của một SOF sẽ làm tất cả các Node trong mạng CAN được đồng bộ.
  4. Tất cả các cạnh chuyển từ recessive thành dominant khác theo luật 1 và luật 2 sẽ sử dụng Tái đồng bộ. Ngoại trừ, một Node truyền một bit dominant sẽ không thực hiện Tái đồng bộ khi cạnh chuyển từ recessive sang dominant với lỗi pha dương, nếu chỉ có các cạnh recessive-dominant được sử dụng cho việc Tái đồng bộ.
6. Giải thích về các yêu cầu và quy luật đồng bộ

Kết hợp quy tắc Đồng bộ cứng và Quy luật đồng bộ thì Đồng bộ cứng chỉ xảy ra khi bắt đầu bit SOF khi xét trong một thông điệp.

Sự tái đồng bộ có hai cơ chế thực hiện tùy vào độ lớn của lỗi pha:
  • Lỗi pha nhờ hơn hoặc bằng RJW thì Tái đồng bộ khởi động lại việc tính thời gian bit vào đoạn Sync_seg như đồng bộ cứng
  • Lỗi pha lớn hơn RJW thì Tái đồng bộ kéo dài đoạn Phase_seg1 hoặc rút ngắn đoạn Phase_seg2 theo giá trị cấu hình RJW

Hình 3. Sự tái đồng bộ khi xuất hiện lỗi pha dương nhỏ hơn RJW (trên) và lớn hơn RJW (dưới)
Hình 4. Sự tái đồng bộ khi xuất hiện lỗi pha âm nhỏ hơn RJW (trên) và lớn hơn RJW (dưới)







[CAN2.0][Controller Area Network][Bài 9] Quy định về thời gian bit - Bit Timing

1. Tốc độ bit danh định (Nominal Bit Rate)

Tốc độ bit danh định (fn) là số bit được truyền trong một giây (bps - bit per second) bằng bộ truyền lý tưởng và không có sự tái đồng bộ xảy ra. Sự tái đồng bộ cho phép hiệu chỉnh lại ví trí lấy mẫu bit khi xuất hiện sự lệch bit trên đường truyền.

Tốc độ bit danh định có thể hiểu là tốc độ bit cao nhất mà đường truyền có thể đạt được trên lý thuyết.

2. Thời gian bit danh định (Nominal Bit Time)

Thời gian bit danh định (Nominal Bit Time) được định nghĩa như sau:

Thời gian bit danh định (Tn) = 1/(Tốc độ bit danh định - fn)

Thời gian bit danh định được chia thành 4 đoạn riêng biệt (4 khoảng thời gian) không chồng lấn lên nhau là
  • Đoạn đồng bộ (Synchronization Segment) ký hiệu là Sync_seg
  • Đoạn lan truyền (Propagation Time Segment) ký hiệu là Prop_seg
  • Đoạn đệm pha thứ nhất (Phase Buffer Segment 1) ký hiệu là Phase_seg1
  • Đoạn đệm pha thứ hai (Phase Buffer Segment 2) ký hiệu là Phase_seg2.
Hình 1. Các phân đoạn thời gian của 1 bit

Sync_seg: Đoạn này dành cho việc đồng bộ giữa các Node trong 1 bus CAN. Một cạnh bit xuất hiện trên bus sẽ được mong chờ nằm trong đoạn này. Một Node luôn giám sát và tính toán thời gian bit. Trong khi truyền dữ liệu, bất cứ khi nào xuất hiện sự chuyển mức logic (cạnh bit) thì Node phải đồng bộ lại hoặc hiệu chỉnh cách tính toán thời gian bit để việc lấy mẫu bit được chính xác. Khi một cạnh bit xuất hiện mà Node gimas sát thấy nằm đúng trong đoạn Sync_seq thì đường truyền đang ổn định và các Node đang có sự đồng bộ tốt.

Prop_seg: Đoạn này được dùng để bù cho các thời gian trễ vật lý trong mạng. Nó gấp hai lần khoảng thời gian lan truyền tín hiệu trên bus, độ trễ mạch so sánh (comparator) ngõ vào và độ trễ mạch lái (driver) ngõ ra.

Phase_seq1 và Phase_seq2: Hai đoạn này dành cho việc bù lỗi pha của cạnh bit. Thời gian các đoạn này có thể được kéo dài hoặc rút ngắn khi thực thi tái đồng bộ.

Vị trí lấy mẫu (Sample point) là thời điểm tại đó mức trạng thái của bus CAN được đọc để xác định giá trị logic của bit. Ví trí lấy mẫu là ở cuối đoạn Phase_seg1. Trong quá trình truyền nhận dữ liệu, đoạn Phase_seg1 và Phase_seg2 được điều chỉnh để tái đồng bộ nhưng vị trí lấy mẫu này luôn ở cuối Phase_seg1.

Thời gian xử lý thông tin Tifp (Information processing time) là thời gian dự trữ tính từ vị trí lấy mẫu dành cho việc tính toán mức bit tiếp theo trong chuỗi. Độ dài của nó được xác định tùy vào phần cứng (chip) CAN controller.

3. Tính toán thời gian bit

Đơn vị thời gian sử dụng trong chuẩn CAN là TQ (Time Quantum) được tính từ chu kỳ bộ dao động Tos (chu kỳ xung clock) của CAN controller, datasheet hoặc user manual của CAN controller sẽ quy định rõ nguồn clock này. Bộ dao động ở đây có thể là thạch anh hay bộ tạo dao động bên trong chip cấp cho CAN controller.

TQ là đơn vị thời gian cố định trong suốt quá trình hoạt động của Node nhưng có thể lập trình được. Một TQ sẽ bằng m lần TQmin. TQmin (MINIMUM TIME QUANTUM) là đơn vị thời gian tối thiểu được tính từ Tos, n không có giới hạn cụ thể.

TQ = m x TQmin = m x n x Tos

Trong đó m là giá trị nguyên trong khoảng từ 1 đến 32.
Hình 2. Thời gian của 1 bit với n = 4, m = 3

Thời gian từng đoạn chia của 1 bit được quy định cụ thể như sau:
  • Sync_seg:  1 TQ
  • Prop_seg:  từ 1 đến 8 TQ
  • Phase_seg1: từ 1 đến 8 TQ
  • Phase_seg2 = max(Phase_seg1, Tifp) .Nghĩa là, Phase_seg1 và Tifp cái nào lớn hơn thì sử dụng giá trị đó cho Phase_seg2.
    • Trong đó, thời gian xử lý thông tin Tifp nhỏ hơn hoặc bằng 2 TQ
  • Tổng thời gian một bit ít nhất là 8 TQ và tối đa là 25 TQ
Thông thường việc lập trình thời gian bit là cần thiết để tất cả các Node trong mạng có tốc độ bit và thời gian bit giống nhau. Giống nhau ở đây nghĩ là có sự sai lệch ít nhất. Thường các Node này sẽ đi kèm với một vi xử lý hoặc vi điều khiển. Tuy nhiên, CAN có thể được thiết kế mà không cần cấu hình thời gian bit, nghĩa là nó có thể tự điều chỉnh đến tốc độ bit thích hợp chỉ cần cung cấp nguồn xung clock phù hợp. Đối với Node loại này thì vị trí điểm lấy mẫu phải tương thích cho tất cả các Node và thời gian bit theo định nghĩa sau đây:
  • Sync_seg: 1 TQ
  • Prop_seg: 1 TQ
  • Phase_seg1: 4 TQ
  • Phase_seg2: 4 TQ
Hình 3. Thời gian bit cho các linh kiện CAN không lập trình được thời gian bit

4. Độ sai số cho phép của bộ dao động

Độ sai số cho phép tối đa của bộ dao động là 1.58% và sử dụng một bộ cộng hưởng gốm (ceramic resonator) ở tốc độ bus lên đến 125 Kbits/s như nguyên tắc cơ bản. Tham khảo bài báo sau để có thông tin chính xác hơn:

Dais, S; Chapman, M;
“Impact of Bit Representation on Transport Capacity and Clock
Accuracy in Serial Data Streams”,
SAE Technical Paper Series 890532, Multiplexing in Automobiles SP-773 March 1989

Một Node muốn sử dụng được đầy đủ các tốc độ bus của giao thức CAN (full speed) thì cần sử dụng bộ dao động thạch anh. Chip CAN yêu cầu cao nhất về độ chính xác của bộ tạo dao động. Việc xác định độ chính xác của các bộ tạo dao động sử dụng trong các Node của mạng CAN phải được thực hiện.

5. Tính toán thời gian trễ lan truyền và Prop_seg

Như đã trình bày ở trên, đoạn Prop_seg gấp hai lần khoảng thời gian lan truyền tín hiệu trên bus, độ trễ mạch so sánh (comparator) ngõ vào và độ trễ mạch lái (driver) ngõ ra. Độ trễ mạch lái ngõ ra và độ trễ mạch so sánh ngõ vào thuộc chip CAN transceiver.
Hình 4. Giải thích độ trễ giữa 2 Node trong bus CAN

Theo hình minh họa trên, các độ trễ được tính như sau:

  • Độ trễ từ Node A đến Node B:
    • Độ trễ mạch lái ngõ ra tại Node A: Txa
    • Độ trễ trên bus: Tbus
    • Độ trễ mạch so sánh ngõ vào tại Node B: Trb
    • Độ trễ lan truyền từ A đến B:
      • Tprop(A->B) = Txa + Tbus + Txb
  • Độ trễ từ Node B đến Node A:
    • Độ trễ mạch lái ngõ ra tại Node B: Txb
    • Độ trễ trên bus: Tbus
    • Độ trễ mạch so sánh ngõ vào tại Node A: Tra
    • Độ trễ lan truyền từ B đến A:
      • Tprop(B->A) = Txb + Tbus + Txa

Thời gian đoạn Prop_seg:
Tprop_seg = Tprop(A->B) + Tprop(B->A)

Nếu CAN transceiver ở cả 2 Node là cùng loại thì Txa = Txb và Tra = Trb. Vì vậy, thời gian lan truyền từ A đến B và từ B đến A là như nhau.
Tprop_seg = 2 x (Tx + Tbus + Tr)

Số TQ cấu hình cho Prop_seg được tính như sau:

Prop_seg = Tprop_seg/Ttq

Nếu không phải là một số nguyên thì giá trị này được làm tròn lên đến số nguyên gần nhất. Chú ý, thông số cấu hình này được tính trên trường hợp xấu nhất là 2 Node nằm cách xa nhau nhất (nằm ở hai đầu cuối) trong bus CAN.

Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

Thứ Tư, 21 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 8] Luật truyền chuỗi bit của CAN - Bit Stream Coding

1. Loại mã hóa chuỗi bit

Phương pháp mã hóa được sử dụng trong giao thức CAN là phương pháp NRZ mà cụ thể hơn là NRZ-L (Non-Return-to-Zero Level). Đây là dạng mã hóa theo mức, tức là mỗi trạng thái dominant và recesive sẽ được quy định mang một mức áp khác nhau. Cụ thể, dominant là mức thấp tương ứng với logic 0, recessive là mức cao tương ứng với logic 1. Trong suốt thời gian phát một bit, không xảy ra sự chuyển mức.
Hình 1. Mã hóa NRZ

2. Luật chèn bit - Bit stuffing

Vấn đề của loại mã hóa NRZ là có thể dẫn đến mất đồng bộ và nhận sai giá trị bit khi truyền một chuỗi bit cùng mức logic quá dài. Vì vậy, CAN quy định cứ sau 5 bit liên tiếp cùng mức logic thì bộ truyền phải tự động chèn một bit trái mức logic, gọi là bit chèn (STUFF BIT).

Luật chèn bit này áp dụng cho vùng SOF, vùng phân xử, vùng điều khiển, vùng dữ liệu và cùng CRC SEQUENCE. Các cùng còn lại là CRC DELIMITER, ACK FIELD và EOF không áp dụng luật này.
Bộ nhận tự động giám sát để loại bỏ bit chèn khi nhận dữ liệu.

Ví dụ:
  • Chuỗi bit gốc:            0100000  00000  1111  10001
  • Chuỗi bit được chèn: 010000010000011111010001
Hình 2. (a) chuỗi bit gốc (b) chuỗi bit sau khi áp dụng luật chèn bit với S là vị trị bit được chèn thêm

Vai trò của các bit chèn là tạo ra sự chuyển mức (cạnh lên hoặc cạnh xuống) để bộ nhận có thể sử dụng tái đồng bộ. Việc đồng bộ khi truyền nhận dữ liệu sẽ được trình bày sau.

Khung báo lỗi và khung báo quá tải có định dạng cố định và không áp dụng luật chèn bit.

3. Luật phân xử

Như đã trình bày trong các phần trước, luật phân xử bit giải quyết vấn đề xung đột khi nhiều Node cùng truyền dữ liệu. Đồng thời, luật phân xử cũng đảm bảo việc truyền thông điệp không bị bất cứ gián đoạn nào khi có xung đột xảy ra.

Sử phân xử này xảy ra trong vùng IDENTIFIER của thông điệp với bit dominant luôn chiếm ưu thế.

Hình 3. Luật phân xử của CAN bus

Sự phân xử và chèn bit được thực hiện tự động bởi chip (vi mạch) thực hiện giao thức CAN.


Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

Chủ Nhật, 18 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 7] Quy định về trạng thái lỗi của CAN Node và tính hợp lệ của thông điệp

1. Các trạng thái lỗi của CAN Node

Để giám sát và kiểm soát lỗi, mỗi Node đều tự động xác định trạng thái của chính nó dựa trên số lượng lỗi mà nó phát hiện được. Tại một thời điểm, một Node có thể thuộc một trong ba trạng thái sau:
  • Error active - Trạng thái chủ động với lỗi (gọi tắt là trạng thái lỗi chủ động). Đây là trạng thái hoạt động thông thường và tốt nhất của một Node. Node có thể tham gia truyền nhận dữ liệu trên bus một cách bình thường, nếu phát hiện lỗi thì sẽ phát khung báo lỗi với cờ báo lỗi chủ động (ACTIVE ERROR FLAG). Khi cờ báo lỗi chủ động được phát thì đường truyền bị ngắt ngay và các Node đều nhận biết được sự báo lỗi này vì cờ báo lỗi chủ động gồm 6 bit dominant sẽ phá vỡ cấu trúc thông thường của khung dữ liệu hoặc khung yêu cầu và không tuân theo luật chèn bit.
    • Error warning - Trạng thái cảnh báo lỗi là trạng thái lỗi chủ động nhưng Node CAN lúc này giám sát thấy số lượng lỗi phát hiện được quá nhiều đến ngưỡng cần phải báo động để Node có cơ chế xử lý thích hợp. Node trong trạng thái này hoạt động như trong trạng thái lỗi chủ động. Đây là trạng thái không được quy định trong chuẩn CAN Specification 2.0 nhưng hều hết các CAN controller hiện tại đều có.
  • Error Passive - Trạng thái bị động với lỗi (gọi tắt là trạng thái lỗi bị động). Một Node ở trạng thái này sẽ có một vài hoạt động bị giới hạn và kém ưu tiên hơn các Node ở trạng thái lỗi chủ động. Cụ thể, trong khi truyền nhận, nếu phát hiện một lỗi bus thì Node sẽ truyền khung báo lỗi bị động với cờ báo lỗi bị động (PASSIVE ERROR FLAG) toàn là bit recessive nên kém ưu tiên và thông điệp đang truyền có thể vẫn truyền tiếp. Mặt khác nó có thẻ bị ghi đè bởi các Node phát cờ báo lỗi chủ động. Một hạn chế nữa là, Node trong trạng thái lỗi bị động, sau khi vừa truyền xong một thông điệp thì phải chờ thêm một khỏng thời gian của vùng SUSPEND TRANSMISSION trước khi được phép truyền tiếp. Trong khoảng thời gian chờ này, nếu có Node khác truyền dữ liệu thì nó trở thành bộ nhận.
  • Bus-off - Trạng thái ngắt khỏi bus CAN (gọi tắt là trạng thái ngắt bus) là trạng thái Node không được phép có bất cứ táng động nào trên bus. Bộ lái ngõ ra bus, nằm trong chip CAN transceiver, bị ngắt.
2. Cách xác định trạng thái lỗi

Mỗi Node sẽ có 2 bộ đếm được dùng để xác định trạng thái lỗi của Node là:
  • Bộ đếm lỗi truyền (TRANSMIT ERROR COUNT)
  • Bộ đếm lỗi nhận (RECEIVE EROR COUNT)
Hai bộ đếm lỗi này được tích hợp trong phần cứng CAN controller và chạy tự động khi Node CAN hoạt động.

Giá trị của hai bộ đếm lỗi là bộ đếm lỗi truyền (Tx_count) và bộ đếm lỗi nhận (Rx_count) sẽ quyết định Node đang trong trạng thái nào. Các khoảng giá trị của chúng được quy định như sau: 
  • Trạng thái lỗi chủ động ‘Error active’ nếu Tx_count ≤ 127 và Rx_count ≤ 127. 
  • Trạng thái lỗi bị động ‘Error passive’ nếu Tx_count > 127 hoặc Rx_count > 127 nhưng Tx_count ≤ 255. 
  • Trạng thái ngắt bus ‘Bus off’ nếu Tx_count > 255.
  • Trạng thái cảnh báo lỗi 'Error Warning' nếu Tx_count >= 96 hoặc Rx_count >= 96. Đây là trạng thái không được quy định trong CAN Specification 2.0 nhưng được tách ra dựa trên một chú ý (Note) trong chuẩn này. Cụ thể, giá trị của một bộ đếm lỗi lớn hơn "khoảng" 96 sẽ chỉ ra việc bus bị nhiễu nặng và có thể cần kiểm tra điều kiện này.
Hình 1. Các trạng thái của một CAN NODE

3. Các loại lỗi mà một Node CAN có thể phát hiện

Có 5 loại lỗi khác nhau và chúng không loại trừ lẫn nhau, nghĩa là một lỗi xảy ra có thể thuộc hơn 2 loại.
  1. Lỗi bit (BIT ERROR) Một Node khi gửi một bit lên bus thì phải giám sát bit đó. Một lỗi bit được phát hiện ngay trong khoảng thời gian truyền bit đó nếu giá trị được lấy mẫu khi giám sát khác với giá trị bit được truyền ra. Nghĩa là truyền bit dominant nhưng giám sát thấy recessive và ngược lại. Ngoại trừ một số trường hợp dù giá trị gửi ra và giá trị bit giám sát khác nhau nhưng không được xem là lỗi bit, cụ thể như sau:
    1. Gửi một bit recessive trong vùng ACK SLOT nhưng giám sát thấy một bit dominant.
    2. Node gửi cờ báo lỗi bị động nhưng giám sát thấy có bit dominant xuất hiện
  2. Lỗi chèn bit (STUFF ERROR) Một Node giám sát thấy chuỗi 5 bit liên tiếp giống nhau thì sẽ kiểm tra bit thứ 6 có khác cực với 5 bit trước hay không. Nếu không khác thì đây là lỗi chèn bit vì sau 5 bit dominant liên tiếp phải được chèn 1 bit recessive, sau 5 bit recessive liên tiếp phải được chèn 1 bit dominant.
  3. Lỗi CRC (CRC ERROR) CRC SEQUENCE đi kèm theo thông điệp được tính bởi bộ truyền. Các bộ nhận phải tính lại chuỗi CRC giống với cách tính của bộ truyền. Kết quả tính toán này sẽ được dùng để so sánh với chuỗi CRC từ bộ truyền. Nếu hai chuỗi khác nhau thì đó là lỗi CRC.
  4. Lỗi định dạng (FORM ERROR) Một Node giám sát thấy các vùng có định dạng bit cố định (các vùng quy định rõ mức logic cố định của bit là 1 hoặc 0) nhưng chứa 1 hoặc nhiều bit vi phạm quy định thì đó là lỗi định dạng. Ngoại trừ:
    1. Một bộ nhận phát hiện thấy một bit dominant ở bit cuối cùng vùng EOF (bit thứ 7 của EOF) thì không xem đây là lỗi định dạng
  5. Lỗi ACK (ACKNOWLEDGMENT ERROR) là lỗi được phát hiện bởi bộ truyền khi nó không thấy một bit dominant xuất hiện tròng vùng ACK SLOT.
Hình 2. Các vùng được giám sát lỗi

Một Node phát hiện thấy một trong các lỗi trên thì phải phát cờ báo lỗi chủ động hoặc bị động tùy vào trạng thái hiện tại của Node.

Đối với loại lỗi BIT, lỗi chèn bit, lỗi định dạng và lỗi ACK thì việc truyền cờ báo lỗi bắt đầu ngay ở bit kế tiếp ngay sau khi phát hiện lỗi.

Đối với loại lỗi CRC thì cờ báo lỗi chỉ được truyền sau vùng ACK DELIMITER trừ khi có một cờ báo lỗi sinh ra bởi điều kiện khác đang được truyền. Ví dụ, giả sử Node A và Node B đều ở trạng thái lỗi chủ động. Node A là transmitter phát hiện lỗi bit tại bit cuối của CRC Sequence bị lỗi (lỗi Bit). Node A phát cờ báo lỗi bắt đầu từ vùng đáng lẽ là CRC Delimiter và làm vi phạm định dạng bit của vùng CRC Delimiter. Node B không phát hiện ra lỗi ở bit cuối CRC Seuqence nhưng sau khi nhận bit cuối cùng của CRC Sequence thì Node B kiểm tra thấy lỗi CRC. Tuy nhiên, Node B giám sát thấy vùng CRC Delimiter bị lỗi (lỗi định dạng - FORM ERROR) nên Node B phát cờ báo lỗi của nó  bắt đầu từ vùng đáng lẽ là ACK SLOT chứ không chờ sau vùng ACK DELIMITER mới phát cờ báo lỗi để đáp ứng cho lỗi CRC.
Hình 3. Ví dụ về việc phát hiện lỗi và báo lỗi

4. Quy định về việc tăng/giảm giá trị các bộ đếm lỗi

Hai bộ đếm lỗi Tx_count và Rx_count khi nào tăng? khi nào giảm? giá trị tăng hoặc giảm là bao nhiêu? được quy định rõ ràng bởi chuẩn. Trong suốt quá trình truyền một thông điệp, các quy tắc tăng giảm bộ đếm lỗi sau đây sẽ được áp dụng:
  1. Node là bộ nhận phát hiện một lỗi thì Rx_count tăng 1, ngoại trừ phát hiện lỗi bit khi phát cờ báo lỗi chủ động và cờ báo quá tải
  2. Node là bộ nhận phát hiện một bit dominant ở bit đầu tiên sau khi phát một cờ báo lỗi thì Rx_count tăng 1
  3. Node là bộ truyền phát một cờ báo lỗi thì Tx_count tăng 8. Tuy nhiên, Tx_count không thay đổi trong hai trường hợp ngoại lệ sau:
    1. Ngoại lệ 1: Bộ truyền trong trạng thái lỗi bị động phát hiện lỗi ACK và không phát hiện một bit dominant nào trong khi gửi cờ báo lỗi bị động của nó.
    2. Ngoại lệ 2: Nếu bộ truyền gửi một cờ báo lỗi sinh ra bởi lỗi chèn bit xuất hiện trong vùng phân xử mà bit chèn này đáng lẽ là recessive và bộ truyền đã truyền đi bit recessive nhưng lại được giám sát thấy là dominant
  4. Node là bộ truyển phát hiện lỗi bit khi đang truyền cờ báo lỗi chủ động hoặc cờ báo quá tải thì Tx_count tăng 8
  5. Node là bộ nhận phát hiện một lỗi bit trong khi gửi một cờ báo lỗi chủ động hoặc cờ báo quá tải thì Rx_count tăng 8
  6. Sau khi gửi một cờ báo lỗi chủ động, cờ báo lỗi bị động hoặc cờ báo quá tải, nếu một Node phát hiện thêm 7 bit dominant liên tiếp thì:
    1. Trong trường hợp của cờ báo lỗi chủ động và cờ báo quá tải, sau khi phát hiện bit dominant thứ 14 liên tiếp và sau mỗi chuỗi 8 bit dominant tiếp theo thì Tx_count và Rx_count tăng lên 8.
    2. Trong trường hợp của cờ báo lỗi bị động, sau khi phát hiện bit dominant thứ 8 liên tiếp và sau mỗi chuỗi 8 bit dominant tiếp theo thì Tx_count và Rx_count tăng lên 8.
  7. Sau khi truyền thành công một thông điệp (phát hiện được ACK và không có lỗi cho đến khi EOF kết thúc), Tx_count giảm 1 trừ khi Tx_count đang là 0 thì không giảm.
  8. Sau khi nhận thành công một thông điệp (nhận không lỗi đến ACK SLOT và gửi thành công bit ACK) thì:
    1. Rx_count giảm 1 nếu giá trị 1 ≤ Rx_count ≤ 127. 
    2. Rx_count giữa giá trị 0 nếu nó đang bằng 0
    3. Rx_count được gán một giá trị giữa 119 và 127 nếu Rx_count ≥ 127
Chú ý, trong quá trình khởi động (Start-up), chỉ có một Node được phép hoạt động. Nếu Node này truyền một số thông điệp, nó sẽ không nhận được ACK nên phát hiện ra lỗi và lặp lại việc truyền thông điệp. Node này có thể rơi vào trạng thái lỗi bị động nhưng không được phép bị bus-off vì lý do này.

5. Tính hợp lệ của thông điệp

Thời điểm xác nhận sự hợp lệ của thông điệp của bộ truyền và bộ nhận là khác nhau.

Với bộ truyền, thông điệp gọi là hợp lệ khi không có bất kỳ lỗi nào cho đến khi EOF kết thúc. nếu thông điệp bị lỗi thì thông điệp sẽ được tự động truyền lại dựa trên sự ưu tiên. Để có thể cạnh trang với sự truy cập bus từ các thông điệp khác thì việc truyền lại phải được bắt đầu sớm nhất có thể khi bus rảnh (BUS IDLE).

Với bộ nhận, thông điệp gọi là hợp lệ nếu nó không lỗi cho đến bit cuối của EOF. Giá trị bit cuối EOF, được bộ nhận xem như don't care. Bộ nhận phát hiện bit cuối này là dominant cũng không xem là một lỗi định dạng (FORM ERROR) mà đáp ứng lại bằng một khung báo quá tải.

Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

Thứ Bảy, 17 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 6] Khung báo tải (Overload frame) và Khoảng liên khung (Interframe Spacing)

1. Khung báo quá tải (Overload frame)

1.1 Vai trò và cấu trúc

Khung báo quá tải được các Node trong mạng CAN sử dụng để tạo thêm độ trễ giữa các khung dữ liệu và khung điều khiển. Một Node có thể phát nhiều khung báo quá tải liên tiếp nhau để tạo ra độ trễ bus phù hợp.
Hình 1. Khung báo quá tải (Overload frame)
Khung báo quá tải có cấu tạo gồm hai vùng là:
  • Vùng chồng lấn các cờ báo quá tải (superposition of Overload flags) là vùng các Node trên bus cùng phát cờ báo quá tải (Overload flag). Vùng này tương tự như ở khung báo lỗi chủ động với độ dài không cố định.
  • Cờ báo quá tải gồm 6 bit dominant
  • Vùng phân cách khung báo quá tải (Overload delimiter) gồm 8 bit recessive

Khi gặp điều kiện quá tải thì một Node phát khung báo quá tải ở các vị trí sau:
  • Ngay sau EOF của một khung dữ liệu hoặc khung yêu cầu. Nếu trên bus đang truyền khung dữ liệu hoặc khung yêu cầu, một Node phải nhận và chờ đến hết vùng EOF mới được phép phát khung báo quá tải.
  • Ngay sau vùng phân cách (DELIMITER) của một khung báo lỗi hoặc một khung báo quá tải khác.

Có thể thấy khung báo quả tải và khung báo lỗi chủ động có định dạng giống nhau nhưng hai loại khung này sẽ không bị các Node hiểu nhầm vì vị trí phát chúng là khác nhau.
  • Vị trí phát khung báo lỗi là bất cứ khi nào phát hiện lỗi bus khi đang truyền khung dữ liệu và khung yêu cầu. Vì vậy, khi một Node đang giám sát bus, nó phát hiện định dạng như đã mô tả ở trên trong khi khung dữ liệu hay khung yêu cầu chưa truyền xong (chưa hết EOF) thì đó là khung lỗi chủ động
  • Vị trí phát khung báo quá tải là sau EOF và sau vùng phần cách của một khung báo lỗi hoặc báo quá tải. Vì vậy, các Node phát hiện định dạng như đã mô tả ở trên ở các vị trị này thì đó là khung báo quá tải.
Trong điều kiện hoạt động không xuất hiện sự quá tải tại các Node bus, sau các vùng trên phải là khoảng liên khung (Interframe spacing, được trình bày ở cuối bài này). Vì vậy, việc phát khung báo quá tải ở vị trí này sẽ không giống định dạng của khoảng liên khung và tất cả các Node khác trong mạng dễ dàng nhận biết đây là khung báo quá tải và cũng bắt đầu truyền cờ báo quá tải của chúng chồng lấn với cờ báo quá tải hiện tại đang phát.

1.2 Điều kiện báo quá tải

Một Node có thể phát khung này khi gặp một trong các điều kiện sau:
  • Điều kiện 1: Do điều kiện hoạt động nội bộ (cục bộ) của bộ nhận, một bộ nhận có thể không xử lý kịp các thông điệp được gửi đến có thể phát khung báo quá tải để tạm dừng truyền tiếp các khung dữ liệu và khung yêu cầu.
  • Điều kiện 2: Phát hiện bit dominant (bit 0) tại vị trí bit thứ nhất và bit thứ hai của vùng INTERMISSION trong khoảng liên khung. Vùng INTERMISSION được quy định gồm 3 bit recessive nhưng Node lại phát hiện bit dominant xuất hiện ở vị trí bit thứ nhất hoặc thứ 2 của vùng này thì nó phải phát khung báo quá tải để ngăn chặn sự truyền.
  • Điều kiện 3: Nếu một Node phát hiện một bit dominant ở vị trí bi thứ 8 (bit cuối cùng) của ở vùng DELIMITER của khung báo lỗi hay khung báo quá tải, nó sẽ truyền ngay một khung báo quá tải. Chú ý, trong trường hợp này các Node sẽ xem khung phát trên bus là khung báo quá tải chứ không phải là khung báo lỗi chủ động cho dù định dạng hai loại giống nhau. Vì vậy, các Node sẽ không coi đây là điều kiện lỗi và không tăng giá trị bộ đếm lỗi, đây là bộ đếm được thiết kế chạy tự động trong các phần cứng chip CAN controller để giám sát trạng thái lỗi của Node.
Việc phát khung báo quá tải trên bus xảy ra như thế nào?
  • Phần lớn việc khởi tạo phát khung báo quá tải là từ hoạt động nội tại của một Node (điều kiện 1).
  • Một Node bắt đầu phát cờ báo quá tải (phát bit dominant) phá vỡ cấu trúc cố định thông thường của vùng INTERMISSION.
  • Các Node khác trong mạng phát hiện thấy có bit dominant ở bit thứ 1 và thứ 2 ở vị trí đáng lẽ là các bit recessive của vùng INTERMISSION (điều kiện 2). Lúc này, tất cả các Node còn lại sẽ bắt đầu phát cờ báo quá tải chồng lấp lên nhau.
  • Tất cả các Node, sau khi phát đủ 6 bit dominant của cờ báo quá tải sẽ chờ cho đến khi phát hiện 1 bit recessive đầu tiên, sau đó phát tiếp 7 bit recessive nữa để hoàn thành vùng phân cách của khung báo quá tải.
  • Nếu một Node trong mạng vẫn cần làm trễ đường truyền thì nó có thể bắt đầu phát cờ báo quá tải ở bit thứ 8 của vùng phân cách khung quá tải hoặc sau bit thứ 8 này.
  • Các Node khác phát hiện thấy bit thứ 8 của vùng phân cách khung báo quá tải là dominant (điều kiện 3) thì bắt đầu phát cờ báo quá tải cúa nó ở bit tiếp theo.
Hình 2. Ví dụ về sự truyền khung báo quá tải (Overload Frame)

2. Khoảng liên khung (Interframe Space)

2.1 Vai trò và cấu trúc

Khoảng liên khung dùng để phân tách giữa các khung dữ liệu và khung yêu cầu với khung vừa phát trước đó. Khung trước đó có thể là khung dữ liệu, khung yêu cầu, khung báo lỗi hoặc khung báo quá tải.

Khoảng liên khung không bao giờ đặt ngay trước các khung báo lỗi và khung báo quá tải vì:
  • Khung báo lỗi phát ngay khi phát hiện lỗi trên bus lúc đang truyền khung dữ liệu và khung mở rộng nên trước nó không thể là một khoảng liên khung.
  • Khung báo quá tải thì phát chiếm chỗ vị trí của khoảng liên khung, tức là phát ngay sau EOF hoặc sau vùng phân cách của một khung báo lỗi hoặc khung báo quá tải trước đó nên trước nó cũng không thể là khoảng liên khung
  • Mặt khác, sau một khoảng liên khung là trạng thái bus IDLE (bus rảnh) và đây không phải là vị trí phát khung báo lỗi hay khung báo quá tải
Nhiều khung báo quá tải liên tiếp nhau thì sẽ truyền liên tục như đã trình bày ở trên chứ không bị phân tách bởi khoảng liên khung.

Có hai cấu trúc khoảng liên khung như sau:
  • Đối với Node không trong trạng thái lỗi bị động (passive error) hoặc Node là bộ nhận và vừa mới nhận xong một thông điệp trước đó thì khoảng liên khung gồm vùng INTERMISSION và BUS IDLE
Hình 2. Định dạng khoảng liên khung (Interframe Space) cho Node không trong trạng thái lỗi bị động hoặc là bộ nhận vừa nhận xong thông điệp

  • Đối với Node trong trạng thái lỗi bị động và vừa mới truyền xong một thông điệp ngay trước đó thì khoảng liên khung gồm vùng INTERMISSION, vùng SUSPEND TRANSMISSION và vùng BUS IDLE
Hình 3. Định dạng khoảng liên khung cho Node đang trong trạng thái lỗi bị động và vừa mới truyền xong khung thông điệp trước đó

2.2 Cấu tạo các vùng

Vùng INTERMISSION là vùng ngưng truyền chứa 3 bit recessive liên tiếp. Trong vùng này, không Node nào được phép bắt đầu truyền khung dữ liệu hoặc khung điều khiển. Chỉ một hoạt động được phép thực hiện là báo hiệu quá tải bằng cách truyền khung quá tải.

Chú ý, như đã trình bày ở trên, việc xuất hiện bit dominant ở vị trí bit thứ 1 hoặc thứ 2 của vùng INTERMISSION sẽ được xem như sự xuất hiện của khung báo quá tải.

Đối với bit thứ 3 của vùng INTERMISSION, nếu một bit dominant xuất hiện thì đó xem như là SOF của khung dữ liệu hoặc khung yêu cầu. Như vậy, một Node có thể bắt đầu truyền thông điệp mới ngay từ bit thứ 3 của vùng INTERMISSION mà không cần chờ đến khi vùng này kết thúc. Lúc này, nếu có các Node khác trong mạng cũng có thông điệp cần truyền thì  sau khi phát hiện bit dominant ở vị trí bit thứ 3 của INTERMISSION, các Node này cũng sẽ bắt đầu phát thông điệp của nó bắt đầu từ bit đầu tiên của vùng IDENTIFIER. Tiếp theo, sự phân xử bus sẽ quyết định Node nào thắng và được truyền tiếp.

Vùng bus rảnh (BUS IDLE) là vùng có độ dài không xác định. Lúc này, bus được xem là tự do, bất kỳ Node nào có thông điệp cần truyền đều có thể phát bắt đầu với SOF.

Vùng cấm truyền (SUSPEND TRANSMISSION) là vùng gồm 8 bit recessive được thêm vào dành cho Node ở trạng thái bị động và vừa truyền xong mộ thông điệp. Sau thông điệp vừa truyền, Node này phải truyền 3 bit recessive của vùng INTERMISSION, tiếp theo phải truyền 8 bit recessive trước khi bắt đầu được phép truyền một thông điệp khác hoặc ghi nhận trạng thái bus rảng (BUS IDLE). Như vậy, nếu giám sát thấy sự xuất hiện của một bit dominant ở bit thứ 3 của INTERMISSION hoặc trong vùng SUSPEND TRANSMISSION thì đó là một SOF nhưng Node này không được phép phát thông điệp của nó như cách đã nói phía trên mà Node này sẽ trở thành bộ nhận thông điệp đang phát bởi các Node khác trên bus.

Có thể thấy một Node đang ở trong trạng thái lỗi bị động, sau khi truyền xong một thông điệp sẽ phải chịu một khoảng cấm truyền và trở nên kém ưu tiên hơn các Node khác trong mạng CAN.

Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa