Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Đăng ký
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
semicon_lab.jpg

SPI cho dân Analog (Phần 2)

Email In PDF.

Thiết kế mạch SPI Slave

Điều làm cho giao tiếp SPI phổ biến chính là tính đơn giản của nó không chỉ trong trong giao thức mà còn trong cả cách thực hiện bằng mạch điện tử. Trở lại với tình huống dẫn dắt chúng ta đến với việc thiết kế mạch giao tiếp SPI: một lượng bit điều khiển cần phải được chuyển vào bên trong một con chíp tổng hợp tần số để điều khiển hoạt động của nó. Bởi vì con chíp chưa có nhu cầu phải truyền dữ liệu ra bên ngoài theo đường MISO, ta chỉ cần thiết kế mạch SPI Slave với 3 đường tín hiệu: SS, SCLK, và MOSI như trong Hình 8. Các bit dữ liệu được gửi vào trên đường MOSI sẽ được “nhớ” trong mạch SPI và được truy xuất bởi các mạch điện khác thông qua các chân b0, b1, b2, …

 

Hình 8: Sơ đồ khối thể hiện các tín hiệu vào/ra cho mạch SPI Slave. Đây là mạch SPI Slave đơn giản chỉ có khả năng nhận dữ liệu vào thông qua chân MOSI. Các bit dữ liệu mà SPI Slave nhận được sẽ được truy xuất qua các chân b0, b1, b2,

Trước tiên, để lưu trữ các bít dữ liệu gửi vào SPI Slave ta sử dụng các DFF (D flip-flop). Mỗi bit dữ liệu sẽ được lưu bởi một DFF. Ta sẽ nhắc lại một chút về cách hoạt động của DFF ở đây để tiện theo dõi còn chi tiết cách thiết kế DFF có thể được tham khảo trong các sách VLSI (thực ra thì các thư viện standard cell luôn có sẵn mạch DFF nên ta cũng ít khi phải tự thiết kế DFF). Hình 9 mô tả hoạt động của một DFF cạnh lên (rising-edge-triggered DFF) có nghĩa là vào thời điểm tín hiệu CLK (clock) chuyển từ thấp sang cao thì giá trị ở chân D (data) được đưa vào lưu giữ bên trong DFF (và giá trị này cũng đồng thời được hiển thị ở chân Q). Ta nói một DFF có khả năng lưu giữ một bít dữ liệu là vì tín hiệu ở chân Q của DFF sẽ được duy trì nếu DFF được cấp nguồn liên tục và ta không cố ý thay đổi giá trị của DFF bằng cách thay đổi mức điện áp ở chân D và thiết lập một cạnh lên ở chân CLK.

 

Hình 9: Ký hiệu, bảng giá trị, và ví dụ về dạng tín hiệu vào/ra của một DFF cạnh lên.

Trở lại với bài toán thiết kế SPI Slave, để đơn giản, hãy giả sử ta muốn gửi mỗi lần 8 bit (n=8) vào con chíp thông qua mạch SPI Slave. Ta sẽ dùng 8 DFF để lưu trữ 8-bit này. 8 DFF được kết nối với nhau thành một chuỗi như trong Hình 10. Đây chính là một thanh ghi dịch (shift-register) có độ rộng 8 bit và hoạt động như một bộ nhớ đệm (input buffer) ở ngõ vào MOSI của mạch SPI Slave. (Nếu muốn gửi nhiều bit hơn trong một lần thực hiện giao tiếp, ta chỉ việc mở rộng bộ nhớ đệm này lên một cách tương ứng). Giá trị được lưu trữ trong bộ nhớ đệm này là Q0Q1Q2Q3Q4Q5Q6Q7. Dữ liệu được đưa vào bộ nhớ đệm qua chân IN. Khi tín hiệu CLK có một cạnh lên thì:

- DFF0 chuyển giá trị của Q1 (chân D) sang Q0 (chân Q)

- DFF1 chuyển giá trị của Q2 (chân D) sang Q1 (chân Q)

- DFF2 chuyển giá trị của Q3 (chân D) sang Q2 (chân Q)

- DFF3 chuyển giá trị của Q4 (chân D) sang Q3 (chân Q)

- DFF4 chuyển giá trị của Q5 (chân D) sang Q4 (chân Q)

- DFF5 chuyển giá trị của Q6 (chân D) sang Q5 (chân Q)

- DFF6 chuyển giá trị của Q7 (chân D) sang Q6 (chân Q)

- DFF7 chuyển giá trị của IN (chân D) sang Q7 (chân Q)

Như vậy các DFF đã dịch các bit dữ liệu được lưu trữ sang phải một vị trí và nhận thêm một bit dữ liệu mới từ chân IN vào Q7. Các xung CLK nối tiếp nhau sẽ làm cho bit dữ liệu ở chân IN được dịch chuyển lần lượt vào bên trong bộ nhớ đệm. Sau 8 xung CLK thì bit dữ liệu được truyền vào đầu tiên sẽ được lưu ở Q0 còn bit dữ liệu được truyền vào cuối cùng được lưu ở Q7. Chi tiết về hoạt động của thanh ghi dịch được minh hoạ trong Bảng 1.

 

Hình 10: Bộ nhớ đệm nối với chân MOSI là một thanh ghi dịch (shift-register) được tạo thành từ các DFF để lưu trữ các bit được truyền vào.

 

Bảng 1: Giá trị các bit được lưu trong bộ nhớ đệm ở các thời điểm khác nhau. Sau xung clock thứ 8, 8 bit dữ liệu đã được truyền vào bên trong bộ nhớ đệm và có thể được đọc ra ở các chân từ Q0 đến Q7.

Ta có thể thấy bộ nhớ đệm tạo thành bởi thanh ghi dịch có thể sample được tín hiệu dữ liệu trên đường MOSI nếu chân IN được nối với MOSI và chân CLK được nối với SCLK. Để biến thanh ghi dịch thành mạch SPI Slave ta cần bổ sung thêm đường tín hiệu Slave Select. Điều này có thể thực hiện bằng cách thêm các cổng logic để chỉ cho phép tín hiệu SCLK đi qua khi tín hiệu Slave Select được kích hoạt. Hình 11 trình bày cách dùng một inverter và một cổng AND để kết hợp tín hiệu SCLK và nSS và tạo thành tín hiệu CLK cho các DFF của bộ nhớ đệm.

 

Hình 11: Mạch SPI Slave hoạt động ở Mode 0 hoặc Mode 3 và có khả năng nhận 8 bit dữ liệu trong mỗi lần truyền.

Mạch trong Hình 11 cũng chính là mạch SPI Slave mà ta cần. Do tín hiệu MOSI được sample bởi DFF7 ở cạnh lên của SCLK, mạch SPI Slave này hoạt động ở Mode 0 hoặc Mode 3.

Kết hợp SPI với thanh ghi – Phần cuối: SPI Master

Dạng đơn giản nhất của mạch SPI Slave như trình bày trong Hình 11 bao gồm các DFF nối liên tiếp với nhau tạo thành một bộ đệm để lưu các bit được gửi vào. Số lượng bit gửi vào càng nhiều thì bộ đệm càng phải được mở rộng. Khi thiết kế trên công nghệ CMOS thì điều này cũng không tốn kém lắm vì cho dù ta có mở rộng số lượng bit lên đến con số hàng ngàn đi nữa thì tổng diện tích của toàn bộ mạch SPI Slave cũng chẳng đáng là bao. Tuy nhiên, bất lợi lớn nhất khi mở rộng bộ đệm theo kiểu này là ta phải tốn nhiều xung clock hơn để ghi dữ liệu vào bộ đệm.

Giả sử như bộ tổng hợp tần số của chúng ta cần tất cả 1024 bit điều khiển. Nếu sử dụng mạch SPI Slave đơn giản với bộ đệm 1024 bit thì ta phải tốn 1024 xung clock để chuyển dữ liệu vào bộ đệm. Tuy nhiên, với mục đích là điều khiển con chíp, trong mỗi lần chuyển dữ liệu ta có thể chỉ muốn thay đổi vài bit để thay đổi hoạt động của một khối chức năng trong mạch (chẳng hạn như thay đổi các tỷ lệ chia tần số R, N, P, hay S). Việc ta phải truyền toàn bộ 1024 bit sẽ gây lãng phí về mặt thời gian và đôi khi không đáp ứng được yêu cầu về tốc độ hoạt động của toàn hệ thống.

Một cách để tránh phải truyền toàn bộ 1024 bit là ta sẽ sử dụng thêm một “bộ nhớ” (thực ra là một nhóm các thanh ghi, như ta sẽ thấy dưới đây) để lưu 1024 bit rồi sau đó trong mỗi lần gửi dữ liệu qua SPI ta chỉ cập nhật một vài bit mà ta muốn thay đổi. Chẳng hạn ta có thể dùng 64 thanh ghi, mỗi thanh ghi có độ rộng 16 bit để lưu 1024 bit. Mỗi lần cập nhật dữ liệu qua SPI ta sẽ cập nhật dữ liệu cho một thanh ghi bằng cách cho biết địa chỉ của thanh ghi cần cập nhật và 16 bit dữ liệu mới cho thanh ghi.

 

Hình 12: 1024 bit dữ liệu được lưu trong 64 thanh ghi, mỗi thanh ghi chứa 16 bit.

Các thanh ghi trong bộ nhớ sẽ được đánh địa chỉ từ 0 đến 63. Để xác định thanh ghi cần cập nhật dữ liệu ta cần dùng 6 bit (2^6 = 64). Như vậy ta sẽ cần phải gửi vào con chíp 22 bit (6 bit địa chỉ + 16 bit dữ liệu). Kinh nghiệm cho thấy việc dùng số lượng bit không phải là bội số của 4 sẽ đem đến nhiều khó khăn về sau khi cần tính toán giá trị hex tương ứng và khi lập trình cho SPI Master. Vậy nên ta sẽ chọn cách gửi vào con chíp 24 bit trong đó có 8 bit địa chỉ và 16 bit dữ liệu. Với 8 bit địa chỉ ta có thể định địa chỉ cho 2^8 = 256 thanh ghi. Tuy nhiên với nhu cầu hiện tại, ta bỏ qua 2 bit địa chỉ MSB mà chỉ dùng 6 bit LSB để định địa chỉ cho 64 thanh ghi. Trong tương lai nếu ta cần dùng nhiều bit điều khiển hơn thì ta hoàn toàn có thể đưa thêm thanh ghi vào (cho đến tối đa là 256 thanh ghi).

Như vậy, trong mỗi lần gửi dữ liệu, bộ đệm ngõ vào của SPI Slave bây giờ sẽ nhận 24 bit. Khi quá trình gửi dữ liệu kết thúc, được đánh dấu bằng việc tín hiệu Slave Select được chuyển trở về trạng thái không tích cực thì một mạch logic sẽ lấy 8 bit địa chỉ từ bộ đệm để giải mã ra địa chỉ thanh ghi cần được cập nhật. Sau đó 16 bit dữ liệu từ bộ đệm sẽ được chuyển vào thanh ghi tương ứng.

Trong số 24 bit được lưu trong bộ đệm, ta có thể quy định bất kỳ 8 bit nào làm bit địa chỉ và 16 bit còn lại làm bit dữ liệu. Chẳng hạn trong ví dụ này ta sử dụng 8 bit đầu tiên (từ b00 đến b07) mà SPI Slave nhận được làm bit địa chỉ với bit LSB được gửi vào đầu tiên như mô tả trong Hình 13. 16 bit tiếp theo (b08 đến b23) là bit dữ liệu. Chú ý rằng việc chọn này là tuỳ ý, không nhất thiết bit địa chỉ phải đi trước và cũng không nhất thiết bit LSB phải đi trước, miễn là bộ giải mã địa chỉ được thiết kế một cách tương ứng.

 

Hình 13: Ví dụ về một cách quy định các bit địa chỉ và bit dữ liệu. Các bit địa chỉ được gửi vào trước với bit LSB đi trước. Các bit dữ liệu được gửi vào sau.

Hình 14 trình bày toàn bộ cấu trúc của mạch SPI Slave kết hợp với một “bộ nhớ” được tạo thành từ các thanh ghi và bộ giải mã địa chỉ. Bộ giải mã địa chỉ là một mạch chọn với n tín hiệu vào (tương ứng với n bit địa chỉ) và 2^n tín hiệu ra trong đó chỉ có một tín hiệu là ở mức active (trong ví dụ này ta lấy mức active là mức cao) còn các tín hiệu còn lại là mức inactive.

 

Hình 14: Sơ đồ mạch SPI Slave kết hợp với một nhóm thanh ghi để tăng số lượng bit được lưu trữ mà vẫn đảm bảo tốc độ cập nhật.

Các bit dữ liệu từ bộ nhớ đệm được chuyển vào thanh ghi tương ứng trong “bộ nhớ” cùng một lúc (chứ không phải chuyển tuần tự như khi chuyển dữ liệu từ đường MOSI vào thanh ghi dịch; chú ý rằng từ lúc này mạch SPI Slave không còn nhận được tín hiệu SCLK nữa). Mỗi thanh ghi trong “bộ nhớ” có thể được thiết kế như trong Hình 15 – đơn giản chỉ là 16 DFF được trigger bởi cùng một tín hiệu clock. Chú ý rằng trong Hình 15, tín hiệu clock cho các thanh ghi trong bộ nhớ chính là tín hiệu nSS.

 

Hình 15: Cấu trúc của một thanh ghi 16 bit với dữ liệu được cập nhật thông qua 16 chân ngõ vào IN[0:15]. Dữ liệu chỉ được ghi khi thanh ghi được chọn (EN ở mức cao) và có một cạnh lên của xung CLK.

Phần cuối: SPI Master

Mạch SPI Master, như trình bày trong Hình 3, nằm trên chíp baseband và việc thiết kế mạch SPI Master là nhiệm vụ của tay thiết kế digital. Tuy nhiên, một điều rất rõ ràng là, nếu không có mạch SPI Master thì ta không thể nào điều khiển con chíp tổng hợp tần số của mình được và vì vậy ta sẽ không thể nào kiểm tra (test) hoạt động của nó.

Mặc dù việc có được một mạch SPI Slave hoạt động đúng đắn là điều kiện tiên quyết để tiếp tục kiểm tra con chíp tổng hợp tần số thì mạch SPI Master lại không may mắn có được một vị trí như vậy trên con chíp baseband. Việc kiểm tra khả năng hoạt động của mạch SPI Master rất có thể sẽ là một trong những việc cuối cùng mà nhóm digital sẽ làm bởi vì họ có hàng tá chức năng quan trọng hơn cần phải kiểm tra. Và cho dù mạch SPI Master có được kiểm tra trước đi chăng nữa, ta cũng phải đợi đến khi toàn bộ con chíp baseband hoạt động tốt thì ta mới có thể sử dụng mạch SPI Master trên chíp baseband.

Giải pháp cho vấn đề trên là tìm cách sở hữu một mạch SPI Master độc lập với chíp baseband. Việc này khá đơn giản. Ta chỉ cần tìm thiết bị có thể tạo ra dạng sóng giống như dạng sóng SPI. Dưới đây là một vài cách mà trong đó ta sử dụng một máy tính để điều khiển một thiết bị phát ra dạng sóng SPI:

- Dùng một SPI Host Adapter như bộ Aardvark I2C/SPI Host Adapter của Total Phase (giá 275USD một bộ vào thời điểm của bài viết). Đây là một thiết bị cắm vào cổng USB của máy tính và chuyển dữ liệu từ máy tính sang dạng sóng SPI. Thiết bị này có trình điều khiển (driver) và giao diện người dùng (GUI) cho Windows/Linux/MacOS. Nếu muốn tạo một giao diện người dùng riêng thì ta có thể sử dụng các hàm API được cung cấp kèm theo cho từng hệ điều hành.

- Dùng một bo mạch chuyển đổi USB sang cổng song song (parallel port) chẳng hạn như bộ FT245 Evaluation Development Board (giá khoảng 23USD trên eBay vào thời điểm của bài viết) để giả lập một cổng song song rồi tạo (bit-bang) tín hiệu SPI ở ngõ ra của bo mạch này.

- Trong trường hợp máy tính có sẵn cổng song song (máy tính để bàn hay máy tính xách tay đời cũ) thì ta chỉ việc lập trình trực tiếp cho cổng song song để giả lập các tín hiệu SPI ở các chân ngõ ra của cổng song song. Cách này thì không cần thêm thiết bị gì khác ngoài một máy tính có sẵn cổng song song.

Ngoài ra ta có thể cần phải thêm các mạch chuyển đổi mức điện áp nếu điện áp ngõ ra của cổng song song không tương ứng với điện áp của mạch SPI Slave.

Nguồn: chuyenmuccongnghe

Bạn Có Đam Mê Với Vi Mạch hay Nhúng      -     Bạn Muốn Trau Dồi Thêm Kĩ Năng

Mong Muốn Có Thêm Cơ Hội Trong Công Việc

    Và Trở Thành Một Người Có Giá Trị Hơn

Bạn Chưa Biết Phương Thức Nào Nhanh Chóng Để Đạt Được Chúng

Hãy Để Chúng Tôi Hỗ Trợ Cho Bạn. SEMICON  

 

Hotline: 0972.800.931 - 0938.838.404 (Mr Long)

 

 

 

 

Lần cập nhật cuối ( Thứ năm, 22 Tháng 8 2019 18:32 )  

Related Articles

Chat Zalo