SPI cho dân analog – Phần 4/4: 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.

spi12

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.

spi13

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.

spi15

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.



Advertisements

3 comments

  1. Pingback: SPI cho dân analog – Phần 1/4: Giới thiệu | Chuyên Mục Công Nghệ

  2. Pingback: SPI cho dân analog – Phần 2/4: Nguyên lý hoạt động | Chuyên Mục Công Nghệ

  3. Pingback: SPI cho dân analog – Phần 3/4: Thiết kế mạch SPI Slave | Chuyên Mục Công Nghệ

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s

%d bloggers like this: