
Lý do đầu tiên, có lẽ vậy, mà bạn, một kỹ sư thiết kế mạch analog, sẽ đọc bài viết này là tay thiết kế mạch digital cùng dự án làm việc nói rằng: “SPI hả? Đơn giản quá. Em không làm đâu!” và cương quyết từ chối cho dù bạn, sếp của bạn—tức là người đứng đầu nhóm analog, và sếp của hắn—tức là người đứng đầu nhóm digital, có ra sức thuyết phục thế nào đi chăng nữa. Vụ tranh cãi chỉ kết thúc khi sếp của bạn kết luận: “Chắc không còn cách nào khác hơn là nhóm analog phải tự thiết kế giao tiếp SPI cho con chíp của mình,” và quay sang phía bạn trước khi bắt đầu câu hỏi cuối cùng: “Đúng không?”
SPI (Serial Peripheral Interface) hay Giao tiếp Ngoại vi Nối tiếp là một giao tiếp thường gặp trên các con chíp hệ thống như chíp thu phát RF (RF transceiver), chíp chuyển đổi analog-digital (ADC/DAC), chíp tổng hợp tần số (synthesizer), vân vân. Cũng như các giao tiếp mà ta thường gặp trong lĩnh vực điện tử máy tính, SPI là một giao tiếp dạng digital. Điều này có lẽ sẽ ngay lập tức làm nhụt chí các tay thiết kế mạch analog—những người thường làm việc với transistor, điện trở, tụ điện, và đôi khi là cuộn cảm hơn là làm việc với các dòng mã HDL (Hardware Description Language) dùng trong thiết kế mạch digital—khi được yêu cầu bổ sung giao tiếp SPI vào con chíp của mình.
Thực tế thì giao tiếp SPI lại rất đơn giản. Đơn giản đến mức khi bạn vỡ lẽ ra việc thiết kế giao tiếp SPI dễ dàng như thế nào thì bạn sẽ hoàn toàn thông cảm với tay thiết kế digital kia vì rằng hắn sẽ chẳng tích luỹ được thêm chút kinh nghiệm gì qua việc thiết kế chỉ một mạch SPI cho bạn.
Ta sẽ tìm hiểu về SPI thông qua một ví dụ. Trong tình huống này bạn có một con chíp tổng hợp tần số do nhiều khối chức năng ghép thành và bạn muốn có khả năng tinh chỉnh hoạt động của các khối chức năng trong con chíp để tối ưu hoá hoạt động sau khi con chíp đã được sản xuất cũng như điều khiển hoạt động của cả con chíp khi nó được tích hợp trong một hệ thống. Một cách trực tiếp nhất là bạn nối tất cả các dòng/áp phân cực, các tín hiệu điều khiển, vân vân, của các khối chức năng ra các I/O riêng, như trong Hình 1. Bạn có thể nhận ra ngay là phương pháp này sẽ dẫn đến việc con chíp có rất nhiều I/O. Điều này làm lãng phí diện tích trên con chíp và làm cho việc đóng gói (packaging) con chíp trở nên rất khó khăn.
Hình 1: Sơ đồ khối của một con chíp tổng hợp tần số với các dòng điện/điện áp để phân cực và điều khiển các khối chức năng bên trong con chíp (các đường màu hồng) được đưa ra ngoài thông qua các I/O. Con chíp sẽ cần rất nhiều I/O cho các tín hiệu này—điều sẽ làm cho con chíp lớn hơn và đôi khi không dễ để đóng gói.
Một giải pháp khác, như được trình bày trong Hình 2, là ta sử dụng các bộ chuyển đổi digital-analog (DAC) để cung cấp các dòng điện và điện áp phân cực cho các mạch analog. Khi đó ta cần phải cung cấp các bit đầu vào cho các bộ DAC. Các bít này được lưu trữ trong một hay nhiều thanh ghi dữ liệu (register) và ta sẽ cần có một giao tiếp để đưa dữ liệu vào các thanh ghi này. SPI có thể giúp ta thực hiện việc truyền dữ liệu từ bên ngoài vào các thanh ghi (và ngược lại, nếu muốn). Bằng cách thay đổi giá trị của các bit được lưu trong các thanh ghi, ta có thể thay đổi các tín hiệu phân cực và điều khiển cho các khối chức năng.
Hình 2: Sơ đồ khối của một con chip tổng hợp tần số sử dụng giao tiếp SPI để thay đổi giá trị của các bít được lưu trong một hay nhiều thanh ghi bên trong con chíp. Các bít dữ liệu này được sử dụng để điều chỉnh phân cực và cung cấp các tín hiệu điều khiển cho các mạch analog. Do giao tiếp SPI chỉ sử dụng bốn I/O, số lượng I/O của con chíp sẽ giảm đi đáng kể.
Ngoài việc giúp làm giảm số lượng I/O, giao tiếp SPI còn có một ưu điểm nữa là nó cho phép con chíp có thể được điều khiển bằng các tín hiệu digital. Ví dụ như trong hệ thống thông tin không dây thì một con chíp xử lý tín hiệu số (chíp baseband) có thể điều khiển hoạt động của chíp tổng hợp tần số thông qua giao tiếp SPI như được trình bày trong Hình 3. Các bộ xử lý trên con chíp baseband có khả năng tính toán và điều khiển chíp tổng hợp tần số theo yêu cầu hoạt động của toàn bộ hệ thống.
Hình 3: Hệ thống thu phát không dây có thể sử dụng một chíp baseband để xử lý tín hiệu. Chíp baseband điều khiển chíp tổng hợp tần số để tạo tín hiệu sóng mang cho toàn bộ hệ thống thu phát không dây. Hai con chíp sử dụng giao tiếp SPI để truyền các tín hiệu điều khiển. Chíp baseband chứa mạch SPI Master còn chíp tổng hợp tần số chứa mạch SPI Slave.
Tuy nhiên, giao tiếp SPI có bất lợi về mặt tốc độ. Việc truyền các bít dữ liệu thông qua giao tiếp SPI tốn nhiều xung clock do đó các thông số cần được thay đổi nhanh có thể sẽ không phù hợp để được cập nhật thông qua SPI. Chẳng hạn như trong Hình 2, tín hiệu điều khiển các bộ chia tần số có thể phải được cập nhật thật nhanh để chuyển kênh tần số trong thời gian cho phép. Nếu chíp baseband muốn thay đổi các bộ chia tần số với tốc độ cao hơn tốc độ cập nhật các thanh ghi (thông qua giao tiếp SPI) thì ta không thể sử dụng SPI cho mục đích điều khiển các bộ chia tần số được. Các tín hiệu điều khiển tốc độ cao khi đó phải được đưa ra các I/O (như trong Hình 1) để chíp baseband có thể điều khiển trực tiếp.
Hình 4 trình bày sơ đồ kết nối hai hệ thống với nhau bằng giao tiếp SPI. Một hệ thống được trang bị bộ thu/phát tín hiệu SPI Master còn hệ thống kia được trang bị bộ thu/phát tín hiệu SPI Slave. SPI Master và SPI Slave kết nối với nhau thông qua bốn đường tín hiệu:
- SS (Slave Select): về cơ bản đây là tín hiệu báo sự bắt đầu và kết thúc một lần thu/phát dữ liệu qua SPI. Tín hiệu SS sẽ do bộ SPI Master tạo ra.
- SCLK (Serial Clock): tín hiệu clock được tạo ra bởi SPI Master để định thời cho dữ liệu. Tại mỗi cạnh lên hoặc xuống của mỗi clock, một bit dữ liệu sẽ được truyền đi trên dây MOSI và MISO.
- MOSI (Master Out Slave In): đường truyền dữ liệu từ SPI Master đến SPI Slave. Tín hiệu trên đường dây này do SPI Master tạo ra.
- MISO (Master In Slave Out): đường truyền dữ liệu từ SPI Slave đến SPI Master. Tín hiệu trên đường dây này do SPI Slave tạo ra.
Hình 4: Hai hệ thống kết nối với nhau qua SPI. Một hệ thống được trang bị SPI Master còn hệ thống kia được trang bị SPI Slave. SPI Master và SPI Slave kết nối với nhau qua bốn đường tín hiệu: Slave Select (SS), Serial Clock (SCLK), Master-Out-Slave-In (MOSI), và Master-In-Slave-Out (MISO). Hướng mũi tên trên các đường tín hiệu cho biết nơi tạo ra và nơi nhận tín hiệu.
Hình 5: Dạng sóng tiêu biểu của các tín hiệu dùng trong giao tiếp SPI. Các mũi tên trên dạng sóng của SCLK được dùng để minh hoạ thời điểm tín hiệu trên các đường MOSI/MISO được lấy mẫu (sample), trong ví dụ này dữ liệu được sample ở cạnh xuống của SCLK.
Hình 5 trình bày ví dụ về dạng sóng trên các đường tín hiệu của giao tiếp SPI trong một lần gửi dữ liệu. Đầu tiên SPI Master sẽ chuyển trạng thái của tín hiệu Slave Select từ inactive (không hoạt động) sang active (hoạt động). Trong trường hợp này đường tín hiệu SS được ký hiệu là nSS để nhấn mạnh rằng mạch sẽ ở chế độ active khi nSS ở mức thấp. (Việc chọn mức thấp hay mức cao làm mức active là tuỳ ý người thiết kế miễn là SPI Master và SPI Slave dùng chung một quy ước.)
Sau khi tín hiệu Slave Select được chuyển sang active một thời gian, SPI Master bắt đầu tạo tín hiệu clock trên đường dây SCLK để định thời cho SPI Slave (và cho cả bản thân mạch SPI Master). SPI Slave căn cứ vào tín hiệu SCLK để nhận hay/và gửi tín hiệu.
Giao tiếp SPI là một giao tiếp full-duplex nghĩa là dữ liệu có thể đồng thời được gửi trên cả hai chiều: từ SPI Master sang SPI Slave (trên đường MOSI) và từ SPI Slave sang SPI Master (trên đường MISO). Khi truyền dữ liệu từ SPI Master sang SPI Slave:
- Tại một cạnh lên hoặc xuống của tín hiệu SCLK, SPI Master tạo điện áp mức cao hoặc thấp để biểu diễn 1 hoặc 0 trên đường MOSI. SPI Master sẽ duy trì điện áp này trong một chu kỳ của SCLK trước khi chuyển sang một mức điện áp khác để gửi đi bit tiếp theo trong chu kỳ SCLK kế tiếp. Việc tạo điện áp được gọi là setup. Trong Hình 3, các bit được setup bởi SPI Master ở các cạnh lên (rising edge) của SCLK.
- SPI Slave nhận dữ liệu trên đường MOSI bằng cách lấy mẫu (sample) điện áp trên đường dây này. Để thu được dữ liệu chính xác, SPI Slave phải lấy mẫu một bit dữ liệu trong khoảng thời gian từ khi SPI Master setup bit đó đến trước khi SPI Master setup bit kế tiếp. Trong Hình 5, SPI Slave sample các bit dữ liệu ở các cạnh xuống (falling edge) của SCLK.
Tóm lại, trên đường MOSI, SPI Master sẽ setup một bit ở một cạnh của SCLK, SPI Slave sẽ chờ một nửa chu kỳ rồi mới sample bit đó ở cạnh kế tiếp của SCLK. SPI Master sẽ chờ thêm một nửa chu kỳ kể từ khi SPI Slave bắt đầu sample rồi mới setup bit kế tiếp ở cạnh tiếp theo của SCLK. Cứ mỗi chu kỳ của SCLK, một bit sẽ được truyền đi.
Tương tự như vậy, khi truyền dữ liệu từ SPI Slave sang SPI Master trên đường MISO, SPI Slave setup tín hiệu còn SPI Master sample tín hiệu lần lượt ở mỗi cạnh của SCLK. Chú ý rằng mặc dù dữ liệu truyền từ SPI Slave sang SPI Master, tín hiệu SCLK vẫn do SPI Master tạo ra. SPI Master luôn là hệ thống quyết định khi nào bắt đầu/kết thúc chuyển dữ liệu (thông qua tín hiệu Slave Select) và khi nào setup/sample từng bit (thông qua tín hiệu SCLK).
Khi quá trình truyền dữ liệu kết thúc, SPI Master không gửi tín hiệu SCLK nữa và sau đó chuyển tín hiệu Slave Select sang mức inactive để SPI Slave không thể sample/setup dữ liệu trên các đường MOSI/MISO.
Để đảm bảo cho tín hiệu trên SPI được phát và thu đúng, SPI Master và SPI Slave phải được thiết kế phù hợp với nhau. Trong bảng mô tả đặc tính của một giao tiếp SPI, ta thường gặp các thông tin sau:
- SS Active Low/High: thông số này cho biết mạch SPI Slave được chuyển sang trạng thái active khi tín hiệu Slave Select là thấp hay cao. Mạch SPI Master sẽ điều khiển tín hiệu Slave Select tương ứng để kích hoạt hoặc ngừng kích hoạt mạch SPI Slave.
- CPOL (viết tắt của Clock POLarity): thông số này cho biết tín hiệu SCLK có dạng như thế nào.
+ CPOL = 0: cạnh đầu tiên của SCLK là cạnh lên (khi không hoạt động thì SCLK ở mức thấp) và mỗi xung clock bao gồm cạnh thứ nhất là cạnh lên và cạnh thứ hai là cạnh xuống.
+ CPOL = 1: cạnh đầu tiên của SCLK là cạnh xuống (khi không hoạt động thì SCLK ở mức cao) và mỗi xung clock bao gồm cạnh thứ nhất là cạnh xuống và cạnh thứ hai là cạnh lên.
Hình 6: Dạng sóng của SCLK được quy định bởi thông số CPOL.
- CPHA (viết tắt của Clock PHAse): thông số này cho biết tín hiệu MOSI và MISO được setup và sample ở cạnh nào của SCLK.
+ CPHA = 0: tín hiệu được sample ở cạnh thứ nhất của xung SCLK và được setup ở cạnh thứ hai của xung SCLK. Chú ý rằng trong trường hợp này bit dữ liệu đầu tiên sẽ được setup trước khi có xung SCLK.
+ CPHA = 1: tín hiệu được setup ở cạnh thứ nhất của xung SCLK và được sample ở cạnh thứ hai của xung SCLK.
Hình 7: Bốn kiểu định dạng dữ liệu cho MISO/MOSI
Tổng hợp hai thông số CPOL và CPHA cho ta bốn kiểu (mode) định dạng dữ liệu trên MISO/MOSI (xem Hình 7):
- Kiểu 0 (Mode 0) (CPOL = 0, CPHA = 0): dữ liệu được bên phát setup ở cạnh xuống của xung clock trước đó và được bên thu sample ở cạnh lên của xung clock hiện tại.
- Kiểu 1 (Mode 1) (CPOL =0, CPHA = 1): dữ liệu được bên phát setup ở cạnh lên của xung clock và được bên thu sample ở cạnh xuống của xung clock.
- Kiểu 2 (Mode 2) (CPOL =1, CPHA = 0): dữ liệu được bên phát setup ở cạnh lên của xung clock trước đó và được bên thu sample ở cạnh xuống của xung clock hiện tại.
- Kiểu 3 (Mode 3) (CPOL =1, CPHA = 1): dữ liệu được bên phát setup ở cạnh xuống của xung clock và được bên thu sample ở cạnh lên của xung clock.
Ngoài ra còn có hai thông số khác:
- Clock-rate: thông số này cho biết tốc độ tối đa của tín hiệu SCLK mà mạch SPI (Master và Salve) hoạt động được một cách đáng tin cậy.
- MSB first hay LSB first: thông số này liên quan đến cách một byte dữ liệu được truyền đi như thế nào-với bit MSB trước hay với bit LSB trước. Mặc dù thông số này không trực tiếp liên quan đến đặc tính điện của tín hiệu trên giao tiếp SPI, nhưng đây cũng là một thông số cần để ý khi phát triển các ứng dụng để xử lý các bit dữ liệu được thu/phát trên giao tiếp SPI.
Hình 8a-e dưới đây trình bày các ví dụ về tín hiệu SPI thực tế trên máy hiện sóng. Các thông số sau được sử dụng chung trong cả 5 ví dụ:
- Slave Select hoạt động ở mức thấp
- Tốc độ: 125 kHz
- Dữ liệu: 8 bit nhị phân có giá trị 0x53 (hex) hay 0b01010011 (nhị phân)
Hình 8a-d là dạng sóng trong các Mode 0-4 với bit MSB được truyền đi trước. Hình 8e là dạng sóng trong Mode 1 với bit LSB được truyền đi trước.
Hình 8a: Mode 0, MSB First.
CPOL = 0 (Rising/Falling), CPHA=0 (Sample/Setup). Tín hiệu MOSI và MISO được thay đổi (setup) ở cạnh xuống của SCLK. Các bộ đệm (MOSI_Input_Buffer và MISO_Input_Buffer) nhận dữ liệu (sample) ở cạnh lên của SCLK.
Hình 8b: Mode 1, MSB First.
CPOL = 0 (Rising/Falling), CPHA=1 (Setup/Sample). Tín hiệu MOSI và MISO được thay đổi (setup) ở cạnh lên của SCLK. Các bộ đệm (MOSI_Input_Buffer và MISO_Input_Buffer) nhận dữ liệu (sample) ở cạnh xuống của SCLK.
Hình 8c: Mode 2, MSB First.
CPOL = 1 (Falling/Rising), CPHA=0 (Sample/Setup). Tín hiệu MOSI và MISO được thay đổi (setup) ở cạnh lên của SCLK. Các bộ đệm (MOSI_Input_Buffer và MISO_Input_Buffer) nhận dữ liệu (sample) ở cạnh xuống của SCLK.
Hình 8d: Mode 3, MSB First.
CPOL = 1 (Falling/Rising), CPHA=1 (Setup/Sample). Tín hiệu MOSI và MISO được thay đổi (setup) ở cạnh xuống của SCLK. Các bộ đệm (MOSI_Input_Buffer và MISO_Input_Buffer) nhận dữ liệu (sample) ở cạnh lên của SCLK.
Hình 8e: Mode 1, LSB First (so sánh với Hình 8b: Mode 1, MSB First).
Nguồn: chuyenmuccongnghe
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)