Giao tiếp ngoại vi nối tiếp SPI (Serial Peripheral Interface)

Một phần của tài liệu Nghiên cứu và triển khai hệ vi xử lý trên cơ sở lõi xử lý MicroBlaze, thử nghiệm ứng dụng trên FPGA (Trang 62)

Để kết nối DAC với bus PLB của lõi xử lý mềm MicroBlaze, EDK hỗ trợ khối giao tiếp mềm XPS SPI. Khối giao tiếp mềm SPI cung cấp phƣơng thức truyền thông đơn giản cho dữ liệu, hỗ trợ 4 đƣờng giao tiếp tín hiệu là MOSI (lối ra dữ liệu nối tiếp), MISO (lối vào dữ liệu nối tiếp), SCK (xung clock) và SS (tín hiệu lựa chọn chip). Các tín hiệu này sẽ đƣợc gán trực tiếp với các tín hiệu vào/ra của bộ chuyển đổi

DAC trong hệ vi xử lý mà ta xây dựng. Ngoài ra giao tiếp SPI còn hỗ trợ tùy chọn bộ nhớ đệm FIFOs cho việc truyền và nhận dữ liệu, có chế độ truyền thông liên tục và tự động kiểm tra các thiết bị ngoại vi. Sơ đồ khối của khối giao tiếp mềm SPI đƣợc chỉ ra nhƣ Hình 29.

Hình 29: Sơ đồ khối của lõi XPS SPI [11].

Trong đó:

Mô-đun giao tiếp PLB: Mô-đun này hỗ trợ việc giao tiếp tới bus PLB. Hoạt động chuyển đổi đọc và viết trên bus PLB đƣợc thực hiện thành hoạt động chuyển đổi trong kết nối IP (IPIC) tƣơng đƣơng. Các thanh ghi giao tiếp của SPI đƣợc kết nối tới IPIC. Mô-đun này cũng hỗ trợ một thiết bị phục vụ giải mã địa chỉ.

Mô-đun các thanh ghi của SPI: Mô-đun này bao gồm tất cả các thanh ghi định vị bộ nhớ giao tiếp với bus PLB. Trong đó có một thanh ghi trạng thái 8-bit, một thanh ghi điều khiển 8-bit, một thanh ghi lựa chọn slave N-bit (N<=32) và một cặp thanh ghi truyền/nhận dữ liệu 8-bit.

Để điều khiển việc kết nối các chân tín hiệu đầu ra của khối giao tiếp mềm SPI với các chân tín hiệu đầu vào của bộ chuyển đổi số-tƣơng tự DAC trên kit Spartan-3E ta xét một số thanh ghi của khối này:

- Thanh ghi điều khiển SPI (SPICR): Thanh ghi này có địa chỉ đƣợc xác định bởi “địa chỉ cơ sở + 0x60”. Thanh ghi này cho phép ngƣời lập trình điều khiển các khối ngoại vi khác nhau của SPI. Định dạng thanh ghi điều khiển SPI đƣợc chỉ ra nhƣ Hình 30.

Cho phép quyền lựa chọn Slave thực thi Reset bộ đệm nhận FIFO 24 25 0 22 Reset bộ đệm truyền FIFFO CPHA CPOL Master SPE LOOP 23 Ngăn chặn Master thực thi 26 27 28 29 30 31

Hình 30: Định dạng thanh ghi điều khiển SPI.

Trong đó các bit từ 0 đến 22 đƣợc dành riêng cho những mục đích khác. Các bit còn lại tùy theo mục đích sử dụng mà ngƣời dùng có thể đọc hoặc ghi dữ liệu các giá trị tƣơng ứng để điều khiển thực thi Master, Slave; Reset/thực thi bộ đệm truyền, bộ đệm nhận; định nghĩa cực tính xung clock (bit CPOL) hay định dạng khung truyền dữ liệu (bit CPHA); điều khiển việc thiết lập chế độ hoạt động lặp vòng cục bộ (bit LOOP).

Để điều khiển việc truyền dữ liệu từ MicroBlaze tới DAC thì thanh ghi điều khiển phải đƣợc cấu hình để có thể lựa chọn slave ở chế độ thủ công, cấu hình master và cho phép hệ thống SPI hoạt động. Khi đó, giá trị ghi vào thanh ghi này là 0x86. Và nếu cho phép master thực thi thì giá trị ghi vào thanh ghi này là 0x186.

Việc reset hoặc clear bộ đệm truyền và bộ đệm nhận dữ liệu khối SPI đƣợc thực hiện bằng cách ghi giá trị „1‟ hoặc „0‟ vào bit 25, bit 26 của thanh ghi điều khiển SPI. Khi đó giá trị ghi vào thanh ghi này là 0x60 hoặc 0x00.

- Thanh ghi trạng thái SPI (SPISR): Thanh ghi này có địa chỉ đƣợc xác định bởi “địa chỉ cơ sở + 0x64”. Đây là thanh ghi chỉ đọc cho phép ngƣời lập trình có thể thấy đƣợc một vài trạng thái bên ngoài của khối XPS SPI. Nếu giá trị đọc ra trên bit số 29 của thanh ghi này bằng „1‟ thì bộ đệm truyền của khối SPI rỗng và ta có thể tiến hành ghi dữ liệu vào thanh ghi truyền dữ liệu. Nhƣ vậy, trƣớc khi truyền dữ liệu ta phải kiểm tra bit này để xác định trạng thái của bộ đệm truyền.

- Thanh ghi truyền dữ liệu (SPIDTR): Thanh ghi này có địa chỉ đƣợc xác định bởi “địa chỉ cơ sở + 0x68” dùng để ghi giá trị dữ liệu đƣợc truyền lên bus SPI. Khi bit cho phép truyền thiết lập ở mức cao, dữ liệu đƣợc truyền từ thanh ghi này tới thanh ghi dịch. Nếu một quá trình truyền trong tiến trình, dữ liệu trong thanh ghi SPIDTR đƣợc tải lên thanh ghi dịch ngay sau khi dữ liệu trong thanh ghi dịch đƣợc truyền tới thanh

ghi nhận dữ liệu thì một quá trình truyền mới đƣợc bắt đầu. Dữ liệu đƣợc lƣu trong thanh ghi SPIDTR cho đến khi có một dữ liệu khác ghi đè lên.

Thanh ghi truyền dữ liệu là thanh ghi chỉ đƣợc viết khi khoảng không gian dành cho dữ liệu viết đã sẵn sàng. Nếu cứ cố tình viết khi bộ đệm nhận FIFO đầy thì quá trình thực hiện viết trên bus PLB sẽ bị lỗi. Mỗi lần ghi giá trị vào thanh ghi này là 8 bit, nếu khung truyền dữ liệu của DAC là 32 bit thì khi thực hiện ứng dụng ta phải tiến hành 4 lần truyền lần lƣợt liên tiếp.

- Thanh ghi lựa chọn Slave (SPISSR): Thanh ghi này có địa chỉ đƣợc xác định bởi “địa chỉ cơ sở + 0x70”, nó lƣu trữ một mức tích cực thấp, một Slave mã hóa lựa chọn véc tơ SS có chiều dài N, với N là số slave đƣợc thiết lập bởi tham số C_NUM_SS_BITS. Đây là thanh ghi 32 bit, các bit từ 0 - (31-N) là các bit đƣợc dành riêng. Các bit từ (31 –N +1) -31: có mức tích cực thấp, một slave mã hóa lựa chọn véc tơ có chiều dài N bit. Với N<= chiều dài bus dữ liệu. Các slave đƣợc đánh số thứ tự từ phải sang trái bắt đầu từ 0 là bit có trọng số thấp nhất. Số slave tƣơng ứng với các chỉ dẫn của tín hiệu SS.

Khi kết nối khối giao tiếp mềm SPI với bộ chuyển đổi số-tƣơng tự DAC thì khối SPI sẽ đóng vai trò là master và DAC đóng vai trò là slave. Khi đó, số slave đƣợc lựa chọn là 1.

- Thanh ghi Reset phần mềm: Thanh ghi này có địa chỉ đƣợc xác định bởi “địa chỉ cơ sở + 0x40”. Nó cho phép ngƣời lập trình reset khối XPS SPI mà không phụ thuộc vào các thiết bị khác trong hệ thống. Giá trị reset viết vào thanh ghi này là 0x0000000A.

Mô-đun các thanh ghi ngắt INTR: Khối này gồm 3 thanh ghi điều khiển ngắt IP là thanh ghi cho phép ngắt toàn cục 32 bit, thanh ghi cho phép ngắt IP 8 bit và thanh ghi trạng thái ngắt IP 8 bit.

Mô-đun SPI: Gồm một thanh ghi dịch, một bộ tạo tốc độ Baud BRG và một khối điều khiển. Mô-đun này hỗ trợ giao diện SPI EEPROM, gồm cả máy trạng thái điều khiển logic và giá trị logic ban đầu. Khi tín hiệu đƣợc MicroBlaze ghi vào thanh ghi truyền dữ liệu SPI, nó sẽ đƣợc chuyển đến thanh ghi dịch của mô đun này và đƣa ra chân tín hiệu dữ liệu truyền MOSI_O.

Các bộ đệm tùy chọn FIFO: Bộ đệm truyền TxFIFO và bộ đệm nhận RxFIFO đƣợc thực hiện trong suốt quá trình truyền và nhận khi đƣợc cho phép bởi tham số C_FIFO_EXIT.

Các tín hiệu vào/ra giao diện SPI: SPI bao gồm các tín hiệu vào/ra để giao tiếp với các ngoại vi nhƣ tín hiệu clock, tín hiệu lựa chọn slave, tín hiệu truyền dữ liệu…

Trong hệ vi xử lý thực nghiệm, ta kết nối khối giao tiếp mềm SPI với bộ chuyển đổi số-tƣơng tự DAC qua 3 chân tín hiệu: tín hiệu truyền dữ liệu MOSI_O, tín hiệu

xung clock SCK_O, tín hiệu lựa chọn slave SS_O. Chân tín hiệu SCK_O sẽ đƣợc nối với tín hiệu SPI_SCK (chân U16) của chip FPGA tƣơng ứng với chân tín hiệu SCK (chân số 8) của DAC; chân tín hiệu MOSI_O sẽ đƣợc nối với tín hiệu SPI_MOSI (chân T4) của chip FPGA tƣơng ứng với chân tín hiệu SDI (chân số 9) của DAC; chân tín hiệu SS_O sẽ đƣợc nối với tín hiệu DAC_CS (chân N8) của chip FPGA tƣơng ứng với chân tín hiệu CS/LD (chân số 7) của DAC.

Sử dụng các công cụ của EDK gán các chân tín hiệu và xác định hƣớng truyền dữ liệu nhƣ mô tả ở trên ta đƣợc kết quả chỉ ra trong file UCF, MSH của Project nhƣ Hình 31.

Hình 31: Minh họa kết nối các chân tín hiệu SPI với hệ thống.

3.3.5. Bộ chuyển đổi tín hiệu số -tương tự DAC

Kit Spartan-3E chứa một bộ giao tiếp truyền thông SPI, bốn kênh biến đổi tín hiệu số thành tín hiệu tƣơng tự tích hợp trong một bộ biến đổi DAC. Bộ biến đổi DAC là vi mạch LTC 2624 bốn kênh DAC, mỗi kênh có đầu vào số là 12 bit. Bốn đầu ra tƣơng tự của bốn kênh DAC này đƣợc nối với giắc cắm J5 trên kit FPGA.

Sự truyền thông SPI

Sơ đồ kết nối bộ chuyển đổi số-tƣơng tự với FPGA qua SPI đƣợc mô tả nhƣ Hình 32 [8].

Net xps_spi_0_MISO_I_pin LOC=N10;

Net xps_spi_0_MISO_I_pin IOSTANDARD = LVCMOS33; Net xps_spi_0_MOSI_O_pin LOC=T4;

Net xps_spi_0_MOSI_O_pin IOSTANDARD = LVCMOS33; Net xps_spi_0_SCK_O_pin LOC=U16;

Net xps_spi_0_SCK_O_pin IOSTANDARD = LVCMOS33; Net xps_spi_0_SS_O_pin LOC=N8;

Net xps_spi_0_SS_O_pin IOSTANDARD = LVCMOS33;

PORT sys_clk_pin = dcm_clk_s, DIR = I, SIGIS = CLK, CLK_FREQ = 50000000

PORT sys_rst_pin = sys_rst_s, DIR = I, SIGIS = RST, RST_POLARITY = 1

PORT xps_spi_0_MOSI_O_pin = xps_spi_0_MOSI_O, DIR = O PORT xps_spi_0_MISO_I_pin = xps_spi_0_MISO_I, DIR = I PORT xps_spi_0_SCK_O_pin = xps_spi_0_SCK_O, DIR = O

PORT xps_spi_0_SS_O_pin = xps_spi_0_SS_O, DIR = O, VEC = [0:0]

UCF

Hình 32: Sơ đồ kết nối bộ chuyển đổi số-tương tự [8].

FPGA sử dụng giao diện ngoại vi nối tiếp SPI để truyền giá trị số của tín hiệu tới mỗi kênh DAC thông qua khối giao tiếp mềm SPI. Bus SPI nhƣ đã mô tả phần trên hỗ trợ kênh kép, đồng bộ và định hƣớng kí tự với một giao tiếp bốn dây đơn. Bus chủ trên Kit FPGA này điều khiển bus tín hiệu xung clock (SPI_SCK) và truyền dữ liệu nối tiếp (SPI_MISO) tới bus SPI tớ-vi mạch DAC. Vào thời điểm tƣơng tự bus tớ sẽ truyền chuỗi dữ liệu nối tiếp (SPI_MOSI) quay trở lại bus chủ.

Bảng 8 đƣa ra danh sách các tín hiệu ghép nối giữa FPGA và DAC. Các tín hiệu SPI_MISO, SPI_MOSI và tín hiệu SPI_SCK chia sẻ bus SPI với các thiết bị khác. Tín hiệu DAC_CS đƣợc kích hoạt ở mức tích cực thấp để lựa chọn đầu ra trên DAC, tín hiệu DAC_CLR cũng có mức tích cực thấp, đồng bộ với tín hiệu reset trên DAC.

Bảng 8: Các tín hiệu giao tiếp của DAC.

Tín hiệu Chân

FPGA Hướng Mô tả

SPI_MOSI T4 FPGADAC Dữ liệu nối tiếp: Master Input và Slave Output.

DAC_CS N8 FPGADAC

Hoạt động ở mức thấp để lựa chọn chíp. Sự chuyển đổi tín hiệu số thành tƣơng tự bắt đầu khi tín hiệu trở lại trạng thái cao. SPI_SCK U16 FPGADAC Tín hiệu Clock

DAC_CLR P8 FPGADAC Tín hiệu đồng bộ, khi ở mức thấp dùng để reset

SPI_MISO N10 FPGADAC Dữ liệu nối tiếp: Master Input và Slave Output.

Vì các tín hiệu bus SPI đƣợc chia sẻ bởi nhiều thiết bị khác nhau trên bản mạch ứng dụng nên cần thiết phải vô hiệu các thiết bị khác khi tại thời điểm SPI giao tiếp với DAC nhằm tránh xung đột bus. Bảng 9 đƣa ra danh sách các giá trị tín hiệu và logic cần thiết để vô hiệu hóa các thiết bị. Mặc dù StrataFlash PROM là thiết bị song song, các bit dữ liệu của nó vẫn đƣợc chia sẻ với tín hiệu SPI_MISO.

Bảng 9: Vô hiệu các thiết bị khác trên FPGA khi kết nối với DAC.

Tín hiệu Thiết bị không cho phép Giá trị không cho phép

SPI_SS_B SPI Serial Flash 1

AMP_CS Programmable Pre-Amplifier 1

AD_CONV ADC 0

SF_CE0 StrataFlash Parallel Flash ROM 1 FPGA_INIT_B Plaform Flash PROM 1

Chu kỳ bus SPI đƣợc mô tả chi tiết trong Hình 33. Mỗi bit đƣợc truyền hoặc nhận đều quan hệ với tín hiệu xung clock SPI_SCK. Dữ liệu đƣợc truyền trên sƣờn lên hoặc sƣờn xuống của xung clock tùy thuộc vào cách cấu hình cho bit CPOL (bit số 28) của thanh ghi điều khiển SPI, trong đề tài này ta cấu hình CPOL=0 để dữ liệu đƣợc nhận trên sƣờn xuống của xung clock SPI_SCK. Tốc độ xung đồng hồ tối đa lên tới 50MHz.

Hình 33: Giản đồ biểu diễn dạng tín hiệu sự truyền thông SPI.

Tần số xung clock SPI_SCK phụ thuộc vào tần số hệ thống bus PLB (PLB_Clk). Trong hệ vi xử lý triển khai tần số PLB_Clk là 50MHz, với hệ số chia là 32. Nhƣ vậy tần số xung clock của tín hiệu SPI_SCK xấp xỉ 1,56MHz.

Để FPGA truyền tín hiệu trên bus SPI_MOSI thì Micro Blaze phải điều khiển tín hiệu DAC_CS ở mức thấp. Việc này đƣợc thực hiện bằng cách ghi giá trị vào thanh ghi lựa chọn slave của SPI là 0x00 (tín hiệu SSở mức thấp). Các bit dữ liệu đã đƣợc MicroBlaze ghi vào thanh ghi truyền dữ liệu của SPI sẽ đƣợc chuyển tới DAC theo thứ tự bit có trọng số lớn nhất đƣợc truyền trƣớc. LTC2624 giữ dữ liệu đầu vào (SPI_MOSI) trên sƣờn cao của xung clock SPI_SCK. Dữ liệu phải đƣợc xác nhận giá trị sau ít nhất 4ns sau sƣờn cao của xung clock.

Sau khi truyền hết 32 bit dữ liệu, FPGA hoàn thành việc truyền thông qua SPI bằng cách chuyển DAC_CS lên mức cao. Việc này đƣợc thực hiện bằng cách ghi giá trị vào thanh ghi lựa chọn slave của SPI là 0x01 (tín hiệu SSở mức cao). Khi đó, quá trình chuyển đổi từ tín hiệu số sang tín hiệu tƣơng tự đƣợc bắt đầu.

Kết quả lựa chọn tần số xung clock và tín hiệu SS trong cấu hình phần cứng hệ thống đƣợc chỉ ra nhƣ trong Hình 34.

Hình 34: Lựa chọn tần số xung clock, tín hiệu SStrong cấu hình phần cứng.

- Giao thức truyền thông: DAC cung cấp hai giao thức truyền thông là 24 bit và 32 bit. Giao thức truyền thông 32 bit đƣợc chỉ ra trong Hình 35.

Hình 35: Giao thức truyền thông SPI với LTC2624 DAC.

Trong khi DAC biến đổi, giao diện SPI đƣợc định dạng bởi thanh ghi dịch 32 bit. Mỗi từ lệnh 32 bit bao gồm trƣờng lệnh, trƣờng địa chỉ và trƣờng các giá trị dữ liệu. Trƣớc tiên FPGA gửi đi 8 bit giả, tiếp theo là 4 bit lệnh (thông thƣờng sử dụng từ lệnh có giá trị 0011). Tiếp theo từ lệnh, FPGA gửi trƣờng địa chỉ 4 bit để lựa chọn một hoặc cả bốn kênh đầu ra tƣơng tự của DAC và 4 bit đầu tiên của dữ liệu, tiếp nữa là 8 bit dữ liệu. Cuối cùng 4 bit giả đƣợc thêm vào để truyền đi trong từ lệnh 32 bit.

Giá trị điện áp trên các đầu ra của DAC

Mỗi kênh đầu ra tƣơng tự của DAC tƣơng đƣơng với một giá trị số là 12 bit không dấu, D[11:0], đƣợc FPGA chuyển tới DAC qua giao diện SPI. Điện áp đầu ra này đƣợc tính theo công thức sau:

REFERENCE OUT D V V   4096 ] 0 : 11 [

Với VREFERENCE là điện áp tham chiếu. Điện áp này là khác nhau đối với bốn kênh của DAC. Kênh A và kênh B sử dụng điện áp tham chiếu là 3.3V, kênh C và kênh D sử dụng điện áp tham chiếu là 2,5V, sai số là 5%. Khi đó điện áp trên các đầu ra của các kênh DAC đƣợc tính theo công thức sau;

- Đầu ra trên kênh A và B của DAC:

%) 5 3 , 3 ( 4096 ] 0 : 11 [    D V V VOUTA

- Đầu ra trên kênh D và C của kênh DAC:

%) 5 5 , 2 ( 4096 ] 0 : 11 [    D V V VOUTC

3.3.6. Thực thi trên công cụ EDK

Để triển khai hệ vi xử lý MicroBlaze trên cơ sở các thành phần của hệ đã tìm hiểu ở các mục trên ta sử dụng các công cụ của phần mềm EDK và qua các bƣớc sau:

- Thứ nhất: Tạo Project

Trong bƣớc này ta tạo một project mới, các công cụ của EDK sẽ cho phép ta xây dựng một hệ thống dựa trên các kit hỗ trợ có sẵn của Xilinx. Ở đây ta sẽ lựa chọn kit xây dựng là kit Spartan 3E. Sau khi lựa chọn kit Spartan 3E với các thông số kỹ thuật có sẵn, ta tạo lõi xử lý mềm MicroBlaze trên kit và lựa chọn các tham số kỹ thuật cho MicroBlaze nhƣ tần số (50MHz); kích thƣớc BRAM (Block RAM: RAM ở trong chip, tốc độ cao và do chip quản lý), kích thƣớc này tùy thuộc vào số lƣợng cổng của

Một phần của tài liệu Nghiên cứu và triển khai hệ vi xử lý trên cơ sở lõi xử lý MicroBlaze, thử nghiệm ứng dụng trên FPGA (Trang 62)