Tốc độ truyền dữ liệu Spi. Khóa đào tạo AVR. Làm việc với mô-đun SPI. Phần 1. Thư viện làm việc với giao diện SPI

Giao diện SPI là một trong những giao diện nối tiếp phổ biến nhất hiện nay. Nó được Motorola phát minh và nhanh chóng trở nên phổ biến nhờ tính đơn giản đặc biệt và tốc độ cao. Đồng thời, SPI có lẽ không thể được gọi đầy đủ là một giao diện; đúng hơn, nó chỉ đơn giản là một nguyên tắc giao tiếp, vì tất cả những gì SPI có nghĩa là logic truyền dữ liệu giữa hai thiết bị (“Master” - “Slave”), ít chú ý hơn đến vật lý, người ta có thể nói, nó được triển khai, “tùy theo hoàn cảnh”, nhưng không có giao thức cấp thấp hơn nào cả, ở đây mỗi nhà sản xuất đều đưa ra một thứ gì đó của riêng họ.

Nào, hãy bắt đầu với việc chính. Vậy logic ở đây là gì? Logic là dữ liệu được truyền tuần tự, từng bit một, trong khi dữ liệu đọc và cài đặt được phân tách theo thời gian bằng tín hiệu đồng hồ đặc biệt trên một bus đặc biệt. Bus này được gọi là bus đồng hồ (hoặc bus đồng bộ hóa) và bản chất của sự phân tách là dữ liệu được đọc và đặt trên các cạnh đối diện của các xung đồng hồ được tạo ra trên bus. Điều này, được phân tách rõ ràng về thời gian, sự xen kẽ của cài đặt và số đọc giúp có thể sử dụng cùng một thanh ghi cho cả nhận và truyền dữ liệu. Trước đây (khi bộ nhớ còn nhỏ và đắt tiền, hệ điều hành được lưu trữ trên đĩa mềm, và những con voi ma mút chạy qua cánh đồng) đây là một lợi thế thực sự, hơn nữa, đây là mục đích ban đầu của SPI, nhưng hiện tại không còn vấn đề gì về dung lượng bộ nhớ và hầu hết các thiết bị đều có thể dễ dàng có các thanh ghi đầu vào và đầu ra riêng biệt.

Thiết bị điều khiển bus đồng hồ (nghĩa là tạo xung đồng hồ trên nó) là “Master” hoặc “Master”. Trên thực tế, “Master” kiểm soát tất cả việc trao đổi dữ liệu - anh ta quyết định: khi nào bắt đầu trao đổi, khi nào kết thúc, cần truyền bao nhiêu bit, v.v. Thiết bị thứ hai tham gia trao đổi là “Slave” hoặc “Slave”. Trong SPI, không giống như I2C tương tự, "Slave" hoàn toàn không có quyền, nó không thể ảnh hưởng đến bus đồng hồ và không thể thông báo cho chủ nhân bằng bất kỳ cách nào rằng nó không đúng giờ hoặc ngược lại, nó không đúng giờ. đã sẵn sàng để trao đổi. Nghĩa là, bản thân “Master” phải biết: khi nào nên hỏi “Nô lệ”, hỏi như thế nào và với tốc độ bao nhiêu để có thể trả lời.

Tổng cộng, để trao đổi song công hoàn toàn (đồng thời theo cả hai hướng), giao diện SPI sử dụng 4 dòng (xem hình): SCLK, MOSI, MISO và SS.

  1. SCLK— bus đồng hồ (trên dòng này master tạo ra các xung đồng hồ)
  2. MOSI (M hoa thị ừ, S yêu TÔI n) - đầu ra chính, đầu vào nô lệ (thông qua dòng này, chủ truyền dữ liệu đến nô lệ)
  3. MISO (M hoa thị TÔI N, S yêu ut) - đầu vào chính, đầu ra nô lệ (qua dòng này master nhận dữ liệu từ nô lệ)
  4. SS (S yêu S bầu) - lựa chọn một nô lệ (sử dụng dòng này, chủ sẽ điều khiển các phiên trao đổi)

“1” và “0” được mã hóa bởi mức điện áp trên các bus dữ liệu (MOSI, MISO) theo logic dương thông thường, nghĩa là mức điện áp cao trên bus tương ứng với “một” và mức thấp tương ứng với “ số không". Đồng thời, cách tổ chức lắp đặt các mức này trên xe buýt không được chỉ định ở bất kỳ đâu, tức là đầu ra của máy phát có thể là “kéo đẩy” hoặc “bộ thu mở”. Mức cao thường tương ứng với điện áp cung cấp của vi mạch (nghĩa là, nếu chúng ta đang xử lý các vi mạch 5 volt, thì mức cao là điện áp gần 5 volt, nếu chúng ta đang nói về các vi mạch được cấp nguồn 3,3V, thì mức cao là điện áp gần 3,3V).

Tín hiệu SS đánh dấu sự bắt đầu và kết thúc của phiên trao đổi. Tín hiệu này thường nghịch đảo, nghĩa là trong phiên trao đổi dữ liệu, thiết bị chủ phải đặt đường SS ở mức thấp và trong trường hợp không trao đổi, ở mức cao. Sự hiện diện của tín hiệu SS cho phép chủ tổ chức kết nối với một số nô lệ bằng cách sử dụng cùng một tín hiệu đồng hồ và cùng một bus dữ liệu mà không cần bất kỳ giao thức bổ sung nào (một biến thể của kết nối như vậy được hiển thị trong hình bên trái). Đúng, có một nhược điểm: trong trường hợp này, chủ sẽ phải kết nối với từng nô lệ thông qua một đường SS riêng biệt (để quản lý các phiên trao đổi với từng nô lệ độc lập với nhau), điều này làm tăng tổng số dây được sử dụng.

Nói chung, tên của các dòng không phải là tiêu chuẩn và có thể khác nhau tùy thuộc vào nhà sản xuất (ví dụ: thay vì MOSI, MISO và SCLK, các dòng có thể được gọi là DI, DO và SC hoặc SI, SO và CLK, dòng SS có thể được gọi là CS hoặc RESET).

Hơn nữa, không nhất thiết phải có bốn đường - đôi khi chỉ có thể có ba đường, ví dụ: nếu dữ liệu chỉ được truyền theo một hướng hoặc một bus dữ liệu hai chiều được sử dụng thay vì hai bus dữ liệu một chiều. Rõ ràng, trong trường hợp sau, chỉ có thể trao đổi song công, nghĩa là tại một thời điểm, bạn chỉ có thể truyền hoặc chỉ nhận dữ liệu (nhưng bạn không thể truyền và nhận cùng một lúc).
Nghĩa là, không phải bằng tên của đường dây, cũng không phải bằng cấp điện áp trên chúng, thậm chí không bằng số của chúng, không thể xác định SPI một cách rõ ràng, nhưng điều này có thể được thực hiện hoàn toàn tốt bằng chính phương pháp truyền dữ liệu, bằng cách chúng được cài đặt trên xe buýt và đọc.

Như tôi đã đề cập, dữ liệu được truyền từng bit và dữ liệu được cài đặt và đọc trên các cạnh đối diện của tín hiệu đồng hồ. Thời điểm đọc dữ liệu trong văn học Anh được gọi là chốt cửa(cố định, chụp nhanh) và thời điểm dữ liệu được cài đặt trên bus - sự thay đổi(sự thay đổi). Thời điểm cài đặt được gọi là sự thay đổi do đặc điểm của hầu hết các giao diện nối tiếp. Thông thường, không ai truyền dữ liệu từng bit một; theo quy định, chúng được gửi theo gói 8 bit trở lên (kích thước gói thường là bội số của 8). Về vấn đề này, một thanh ghi dịch chuyển được tạo ra ở đầu ra của máy phát, tại đó toàn bộ gói bit truyền được tải cùng một lúc và giá trị bit thấp hoặc cao của thanh ghi dịch chuyển này được đặt trên bus dữ liệu (tùy thuộc vào cách chúng tôi truyền tải - chuyển tiếp bit thấp hoặc cao) và để đặt nó thành bus của bit được truyền tiếp theo - chỉ cần "dịch chuyển" thanh ghi này. Đây là cách các bộ phát được sắp xếp trong SPI, trong I2C, trong RS232 thông thường và nhiều nơi khác (nó chỉ thuận tiện hơn về phần cứng). Được rồi, hãy quay lại với SPI của chúng ta.

Mức logic của tín hiệu trên bus đồng hồ ở trạng thái không hoạt động (khi không có truyền dữ liệu) được gọi là cực tính và được chỉ định CPOL (nghĩa là, nếu không truyền thì bus SCLK ở mức thấp thì CPOL = 0, và nếu tại thời điểm này bus SCLK ở mức cao thì CPOL=1). Thứ tự của các lần đọc và dịch chuyển xen kẽ được gọi là pha và được chỉ định CPHA (nếu việc đọc xảy ra ở cạnh đầu tiên trên SCLK thì CPHA = 0 và nếu một dịch chuyển xảy ra ở cạnh đầu tiên trên SCLK thì CPHA = 1).

Tùy thuộc vào sự kết hợp của các giá trị CPOL và CPHA, có 4 chế độ hoạt động của giao diện SPI, được chỉ định là Chế độ0, Chế độ1, Chế độ 2Chế độ3. Dưới đây là hình ảnh minh họa cách cài đặt và đọc dữ liệu, tùy thuộc vào chế độ được chọn.

Tôi muốn nhấn mạnh rằng SS chính xác là dòng điều khiển phiên trao đổi chứ không chỉ là dòng lựa chọn nô lệ. Sự khác biệt ở đây là nếu chúng ta coi SS chỉ đơn giản là một đường lựa chọn phụ, thì khi một chủ được kết nối với một nô lệ duy nhất, sẽ có xu hướng không kiểm soát đường này mà làm ngắn mạch nó đến dây chung (chẳng hạn như rằng nô lệ luôn được chọn). Tuy nhiên, logic của nô lệ thường sao cho việc bắt đầu phiên đi kèm với nhiều thủ tục chuẩn bị khác nhau, chẳng hạn như tải dữ liệu vào thanh ghi dịch chuyển đầu ra và đặt lại bộ đếm xung, và nô lệ bắt đầu thực hiện một số hành động (theo các lệnh nhận được qua SPI từ máy chủ) chỉ sau khi hoàn thành phiên trao đổi. Ngoài ra, bạn cũng có thể cần một số phiên giao tiếp (ví dụ: nếu trong phiên đầu tiên bạn gửi lệnh và trong phiên tiếp theo bạn muốn nhận báo cáo về kết quả thực hiện chúng). Tôi nghĩ rõ ràng là nếu bạn kéo chặt đường SS vào dây chung, thì không thể có bất kỳ sự công nhận nào về thời điểm bắt đầu và kết thúc của phiên trao đổi (thời điểm bắt đầu được nhận biết bằng sự suy giảm trên đường SS và kết thúc bằng sự gia tăng); theo đó, toàn bộ việc trao đổi dữ liệu sẽ bị gián đoạn. Vì vậy không nên đánh giá thấp tầm quan trọng của tín hiệu SS.

Và cuối cùng, tôi sẽ nói rằng các chế độ phổ biến nhất là Mode0 và Mode3.

Bạn có thể đọc thêm chi tiết về cách trao đổi diễn ra, những gì một bậc thầy SPI có thể làm và cách triển khai nó trong phần mềm trên vi điều khiển (sử dụng ví dụ về bộ điều khiển PIC và AVR) có thể được đọc trong bài viết

SPI - Giao diện ngoại vi nối tiếp - nối tiếp

giao diện ngoại vi

SPI là một tiêu chuẩn đồng bộ nối tiếp để truyền dữ liệu giữa các vi mạch ở chế độ song công hoàn toàn.

Giao diện này ban đầu được Motorola phát triển để cung cấp giao diện đơn giản và rẻ tiền cho các bộ vi điều khiển và thiết bị ngoại vi và hiện đang được sử dụng trong các sản phẩm của nhiều nhà sản xuất.

Giao diện SPI, cùng với I2C, là một trong những giao diện được sử dụng rộng rãi nhất để kết nối các vi mạch. Tên của nó là viết tắt của “Giao diện ngoại vi nối tiếp” (bus SPI).

SPI bus), phản ánh mục đích của nó - một bus để kết nối các thiết bị bên ngoài. Bus SPI được tổ chức trên cơ sở chủ-nô lệ. Bus master thường là một bộ vi điều khiển, nhưng nó cũng có thể là logic lập trình, bộ điều khiển DSP hoặc ASIC. Các thiết bị bên ngoài được kết nối với bus chủ tạo thành bus phụ. Vai trò của chúng được thực hiện bởi nhiều loại vi mạch khác nhau, bao gồm cả. thiết bị lưu trữ (EEPROM, bộ nhớ Flash, SRAM), đồng hồ thời gian thực (RTC), ADC/DAC, chiết áp kỹ thuật số, bộ điều khiển chuyên dụng, v.v.

Khối xây dựng chính của giao diện SPI là một thanh ghi dịch chuyển thông thường, có tín hiệu đầu vào/đầu ra dòng bit đồng bộ hóa và tạo thành các tín hiệu giao diện. Vì vậy, sẽ đúng hơn nếu gọi giao thức SPI không phải là giao thức truyền dữ liệu mà là giao thức trao đổi dữ liệu giữa hai thanh ghi dịch chuyển, mỗi thanh ghi này đồng thời thực hiện cả chức năng của máy thu và máy phát.

1. Kết nối điện

TRONG sự khác biệt so với cổng nối tiếp tiêu chuẩn cổng nối tiếp tiêu chuẩn), SPI là giao diện đồng bộ trong đó mọi quá trình truyền được đồng bộ hóa với tín hiệu đồng hồ chung được tạo bởi thiết bị chính (bộ xử lý). Thiết bị ngoại vi nhận (nô lệ) đồng bộ hóa việc nhận chuỗi bit với tín hiệu đồng hồ. Nhiều chip có thể được kết nối với một giao diện ngoại vi nối tiếp của chip master. Master chọn Slave để truyền bằng cách kích hoạt tín hiệu chọn chip trên chip Slave. Các thiết bị ngoại vi không được bộ xử lý chọn sẽ không tham gia

trong truyền dẫn SPI.

SPI sử dụng bốn tín hiệu số:

MOSI (eng. Master Out Slave In) - đầu ra của thiết bị chính (ký hiệu thay thế DO, SDO, DOUT), đầu vào của thiết bị phụ để nhận dữ liệu nối tiếp (ký hiệu thay thế DI, SDI, DIN). Dùng để truyền dữ liệu từ thiết bị chính sang thiết bị phụ.

MISO (eng. Master In Slave Out) - đầu vào của thiết bị chính để nhận dữ liệu nối tiếp (ký hiệu thay thế DI, SDI, DIN), đầu ra của thiết bị phụ để truyền dữ liệu nối tiếp (ký hiệu thay thế DO, SDO, DOUT). Dùng để truyền dữ liệu từ thiết bị phụ sang thiết bị chính.

SCLK (eng. Serial Clock) - tín hiệu đồng hồ nối tiếp (ký hiệu thay thế DCLOCK, CLK, SCK). Dùng để truyền tín hiệu đồng hồ cho các thiết bị phụ.

CS hoặc SS - lựa chọn chip, lựa chọn nô lệ

(eng. Chọn chip, Chọn nô lệ).

Có ba loại kết nối với bus SPI, mỗi loại bao gồm bốn tín hiệu. Kết nối đơn giản nhất, chỉ bao gồm hai vi mạch, được hiển thị trong Hình 1.

Cơm. 1. Kết nối đơn giản nhất với bus SPI

Ở đây, bus chủ truyền dữ liệu dọc theo đường MOSI một cách đồng bộ với tín hiệu SCLK do nó tạo ra và bus phụ sẽ ghi lại các bit dữ liệu được truyền trên các cạnh nhất định của tín hiệu đồng bộ hóa nhận được. Đồng thời, Slave gửi gói dữ liệu của nó. Mạch được trình bày có thể được đơn giản hóa bằng cách loại bỏ đường MISO nếu IC phụ được sử dụng không cung cấp khả năng truyền dữ liệu phản hồi hoặc không cần thiết. Truyền dữ liệu một chiều có thể được tìm thấy trong các chip như DAC, chiết áp kỹ thuật số, bộ khuếch đại lập trình và trình điều khiển. Do đó, tùy chọn được xem xét để kết nối IC phụ cần có 3 hoặc 4 đường truyền. Để IC phụ có thể nhận và truyền dữ liệu, ngoài việc có tín hiệu đồng hồ, đường SS cũng phải được điều khiển ở mức thấp. Nếu không, IC phụ sẽ không hoạt động. Khi chỉ sử dụng một IC bên ngoài, có thể loại bỏ đường SS bằng cách đẩy đầu vào chọn của IC phụ xuống mức thấp. Giải pháp này cực kỳ không mong muốn và có thể dẫn đến thất bại hoặc thậm chí không thể truyền dữ liệu, bởi vì Đầu vào chọn chip dùng để đặt lại IC về trạng thái ban đầu và đôi khi khởi tạo đầu ra của bit dữ liệu đầu tiên.

Nếu cần kết nối một số vi mạch với bus SPI, thì kết nối độc lập (song song) sẽ được sử dụng (Hình 2) hoặc kết nối tầng (nối tiếp) (Hình 3).

Cơm. 2. Kết nối độc lập với bus SPI

Cơm. 3. Kết nối tầng với bus SPI

Kết nối độc lập là phổ biến hơn, bởi vì đạt được khi sử dụng bất kỳ chip tương thích SPI nào. Ở đây, tất cả các tín hiệu, ngoại trừ việc lựa chọn các vi mạch, đều được kết nối song song và bus chủ, bằng cách chuyển một hoặc một tín hiệu SS khác sang trạng thái thấp, sẽ chỉ định IC phụ mà nó sẽ trao đổi dữ liệu. Nhược điểm chính của kết nối này là cần có thêm các đường dây để đánh địa chỉ các chip phụ (tổng số đường truyền là 3+n, trong đó n là số lượng chip phụ). Chuyển mạch theo tầng không gặp phải nhược điểm này, bởi vì từ đây

một số chip tạo thành một thanh ghi dịch lớn. Để thực hiện điều này, đầu ra dữ liệu truyền của một IC được kết nối với đầu vào nhận dữ liệu của IC kia, như trong Hình 3. Các đầu vào chọn chip ở đây được kết nối song song và do đó, tổng số đường truyền thông được giữ bằng nhau đến 4. Tuy nhiên, việc sử dụng kết nối tầng chỉ có thể thực hiện được nếu sự hỗ trợ của nó được nêu rõ trong tài liệu dành cho chip được sử dụng. Để tìm hiểu, điều quan trọng là phải biết rằng sự kết nối như vậy được gọi là "chuỗi xích" trong tiếng Anh.

2. Giao thức truyền tải

Giao thức truyền qua giao diện SPI cực kỳ đơn giản và trên thực tế, giống hệt với logic của thanh ghi thay đổi, bao gồm việc thực hiện thao tác dịch chuyển và theo đó, đầu vào và đầu ra bit của dữ liệu trên các cạnh nhất định của tín hiệu đồng bộ hóa. Cài đặt dữ liệu trong quá trình truyền và lấy mẫu trong quá trình nhận luôn được thực hiện trên các cạnh đồng hồ đối diện. Điều này là cần thiết để đảm bảo rằng dữ liệu được lấy mẫu sau khi nó được thiết lập một cách đáng tin cậy. Nếu chúng ta tính đến việc cạnh đầu tiên trong chu kỳ truyền có thể là cạnh tăng hoặc giảm, thì có bốn tùy chọn logic khả thi cho hoạt động của giao diện SPI. Các tùy chọn này được gọi là chế độ SPI và được mô tả bằng hai tham số:

CPOL - mức ban đầu của tín hiệu đồng bộ hóa (nếu CPOL=0 thì đường đồng bộ hóa trước khi bắt đầu chu kỳ truyền và sau khi kết thúc chu kỳ truyền có mức thấp (tức là cạnh đầu tiên tăng lên và cạnh cuối cùng giảm xuống), nếu không , nếu CPOL=1, nó ở mức cao (tức là mặt trước đầu tiên đang giảm và mặt trước cuối cùng đang tăng));

CPHA - giai đoạn đồng bộ hóa; Tham số này xác định trình tự thực hiện cài đặt và lấy mẫu dữ liệu (nếu CPHA = 0, thì ở cạnh tăng trong chu kỳ đồng bộ hóa, dữ liệu sẽ được lấy mẫu, và sau đó, ở cạnh xuống, cài đặt

dữ liệu; nếu CPHA=1 thì việc cài đặt dữ liệu sẽ được thực hiện ở cạnh tăng trong chu kỳ đồng bộ hóa và việc lấy mẫu sẽ được thực hiện ở cạnh xuống).

Chip chính và chip phụ hoạt động ở các chế độ SPI khác nhau không tương thích, do đó, trước khi chọn chip phụ, điều quan trọng là phải làm rõ chế độ nào được bus chủ hỗ trợ. Trong hầu hết các trường hợp, các mô-đun SPI phần cứng được tích hợp vào bộ vi điều khiển đều hỗ trợ khả năng chọn bất kỳ chế độ SPI nào và do đó, có thể kết nối bất kỳ chip SPI phụ nào với chúng (chỉ áp dụng cho tùy chọn kết nối độc lập). Ngoài ra, giao thức SPI ở bất kỳ chế độ nào cũng có thể được thực hiện dễ dàng trong phần mềm.

Bàn 1. Chế độ SPI

Tạm thời

biểu đồ

đồng bộ hóa

3. So sánh với bus I2 C

Như đã đề cập, bus nối tiếp I2 C 2 dây không kém phần phổ biến để kết nối các vi mạch, dưới đây bạn có thể thấy những ưu điểm mà bus nối tiếp này hoặc bus nối tiếp kia mang lại.

Ưu điểm của xe buýt SPI

Ưu điểm của xe buýt I2C

Giao thức cực kỳ đơn giản

truyền lớp vật lý

mang lại độ tin cậy cao và

tốc độ truyền tải. Giới hạn

Hiệu suất bus SPI được đo

Bus I2 C vẫn có hai dây,

hàng chục megahertz và do đó, nó

bất kể số lượng

lý tưởng để phát trực tuyến

vi mạch được kết nối với nó.

lượng lớn dữ liệu và rộng rãi

được sử dụng ở tốc độ cao

DAC/ADC, trình điều khiển LED

màn hình và chip nhớ

Tất cả các tuyến xe buýt SPI đều

một chiều, đó là điều cần thiết

Khả năng đa chủ

đơn giản hóa việc giải quyết vấn đề

hoạt động khi kết nối với xe buýt

chuyển đổi cấp độ và

một số vi mạch hàng đầu.

cách ly điện của vi mạch

Giao thức I2C nhiều hơn

do đó được tiêu chuẩn hóa

Đơn giản hóa việc triển khai phần mềm

người sử dụng chip I2C nhiều hơn

Giao thức SPI.

được bảo vệ khỏi các vấn đề

sự không tương thích của lựa chọn

các thành phần.

4. Các giao thức phái sinh và tương thích

VI SÓNG.

Giao thức MICROWIRE của National Semiconductor hoàn toàn giống với giao thức SPI ở chế độ 0 (CPOL = 0, CPHA = 0).

Giao diện 3 dây Maxim

Sự khác biệt giữa giao diện này là thay vì truyền song công hoàn toàn trên hai đường một chiều, nó thực hiện truyền bán song công trên một đường DQ hai chiều.

QSPI

Giao thức cấp cao hơn SPI, cho phép truyền dữ liệu tự động mà không cần sự tham gia của CPU.

Ngoài ra, giao diện SPI là cơ sở để xây dựng một số giao diện chuyên dụng, bao gồm. Giao diện gỡ lỗi JTAG và giao diện thẻ nhớ Flash, bao gồm. SD và MMC.

Chuyển giao diện.

Nhiều giao diện truyền dữ liệu đã được phát triển để truyền dữ liệu từ thiết bị này sang thiết bị khác hoặc từ chip này sang chip khác. Mỗi giao diện đều có cả mặt tích cực và tiêu cực, vì vậy bạn cần biết có những giao diện nào, ưu và nhược điểm của chúng và sử dụng giao diện phù hợp để truyền dữ liệu trong một tình huống nhất định.

Các giao diện đi kèm với truyền dữ liệu không đồng bộ và đồng bộ. Với truyền dữ liệu đồng bộ, tín hiệu đồng hồ được truyền đồng thời với dữ liệu, cho phép bộ thu và bộ phát đồng bộ hóa. Một ví dụ về giao thức như vậy là giao diện SPI.

Trong truyền dữ liệu không đồng bộ không có tín hiệu đồng hồ. Trong những đường dây như vậy có nguy cơ không khớp giữa máy thu và máy phát, do đó dữ liệu tiếp theo sẽ không được nhận chính xác. Để ngăn chặn điều này, các giao diện không đồng bộ thực hiện đồng bộ hóa định kỳ dọc theo các dòng dữ liệu. Ưu điểm của các giao diện như vậy là số lượng dây dẫn cần thiết để truyền tải ít hơn.

Chúng ta hãy xem xét kỹ hơn một số giao diện phổ biến nhất.

Giao diện USART.

Giao diện USART là một bộ thu phát không đồng bộ đồng bộ phổ quát nối tiếp. Dữ liệu được chuyển đến USART theo định kỳ. Khoảng thời gian này được xác định bởi tốc độ USART đã chỉ định và được chỉ định bằng baud (Đối với các ký tự chỉ có thể lấy giá trị bằng 0 hoặc một, baud tương đương với bit trên giây). Có nhiều tốc độ tiêu chuẩn được chấp nhận rộng rãi: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 baud.

Ngoài các bit dữ liệu, USART còn tự động chèn các dấu đồng bộ hóa vào luồng, được gọi là các bit bắt đầu và dừng. Khi tiếp nhận, các bit bổ sung này sẽ bị loại bỏ. Thông thường, các bit bắt đầu và dừng tách biệt một byte thông tin (8 bit), nhưng có các triển khai USART cho phép truyền 5, 6, 7, 8 hoặc 9 bit. Các bit được phân tách bằng tín hiệu bắt đầu và dừng là mức gửi tối thiểu. USART cho phép bạn chèn hai bit dừng trong quá trình truyền để giảm khả năng không đồng bộ hóa máy thu và máy phát khi lưu lượng truy cập lớn. Bộ thu bỏ qua bit dừng thứ hai, coi nó như một khoảng dừng ngắn trên đường dây.

Quy ước là trạng thái thụ động (trong trường hợp không có dữ liệu) của đầu vào và đầu ra USART là trạng thái logic “1”. Bit bắt đầu luôn là logic “0”, do đó bộ thu USART chờ chuyển đổi từ “1” sang “0” và đếm từ đó một khoảng thời gian bằng một nửa thời lượng của bit (giữa quá trình truyền bit bắt đầu) . Nếu tại thời điểm này đầu vào vẫn là “0”, thì quá trình nhận bưu kiện tối thiểu sẽ bắt đầu. Để làm điều này, bộ thu đếm khoảng thời gian 9 bit liên tiếp (đối với dữ liệu 8 bit) và ghi lại trạng thái đầu vào tại mỗi thời điểm. 8 giá trị đầu tiên là dữ liệu nhận được, giá trị cuối cùng là giá trị kiểm tra (bit stop). Giá trị bit dừng luôn là “1”; nếu giá trị thực tế nhận được khác, USART sẽ ghi lỗi.

Để hình thành các khoảng thời gian, USART truyền và nhận có nguồn thời gian chính xác (đồng hồ). Độ chính xác của nguồn này phải sao cho tổng các lỗi (máy thu và máy phát) trong việc thiết lập khoảng thời gian từ đầu xung bắt đầu đến giữa xung dừng không vượt quá một nửa (hoặc tốt hơn là ít nhất một một phần tư) của khoảng bit. Đối với tin nhắn 8 bit 0,5/9,5 = 5% (trong thực tế không quá 3%). Vì đây là tổng của các lỗi máy thu và máy phát cộng với hiện tượng méo tín hiệu có thể xảy ra trên đường truyền nên dung sai được khuyến nghị cho độ chính xác của xung nhịp USART là không quá 1,5%.

Vì các bit đồng hồ chiếm một phần của dòng bit nên thông lượng UART thu được không bằng tốc độ kết nối. Ví dụ: đối với truyền dẫn định dạng 8-N-1 8 bit, các bit đồng hồ chiếm 20% luồng, với tốc độ vật lý 115.200 baud cho tốc độ bit dữ liệu là 92.160 bps hoặc 11.520 byte/s.

Kiểm tra chẵn lẻ

Giao thức USART có khả năng tự động giám sát tính toàn vẹn dữ liệu bằng phương pháp chẵn lẻ bit. Khi tính năng này được bật, bit dữ liệu cuối cùng ("bit chẵn lẻ") luôn là 1 hoặc 0, do đó số lượng dữ liệu trong một byte luôn là số chẵn.

Kiểm soát lưu lượng

Ngày xưa, các thiết bị USART có thể chậm đến mức không thể theo kịp luồng dữ liệu đến. Để giải quyết vấn đề này, các mô-đun USART đã được cung cấp các đầu ra và đầu vào điều khiển luồng riêng biệt. Khi bộ đệm đầu vào đầy, logic của USART nhận sẽ đặt mức ức chế ở đầu ra tương ứng và USART đang truyền sẽ tạm dừng truyền. Sau đó, điều khiển luồng được gán cho các giao thức truyền thông và nhu cầu về các đường điều khiển luồng riêng biệt dần dần biến mất.

Thực hiện vật lý.

USART là một giao thức trao đổi, tức là nó xác định phương pháp hình thành bit, thông số truyền byte, tốc độ truyền, v.v.

Nhưng việc triển khai USART về mặt vật lý có thể khác. Ví dụ: để truyền dữ liệu trong một bảng, tín hiệu được truyền ở mức +5V và 0V. Để truyền dữ liệu qua khoảng cách xa và giữa các thiết bị, các mức và tiêu chuẩn điện áp vật lý khác được sử dụng, chẳng hạn như: vòng lặp hiện tại (4-20 mA), RS-232 (cổng COM), RS-485, v.v.

Để chuyển đổi các mức 0-5V của “bộ điều khiển” thành các mức “tiêu chuẩn”, có một số lượng lớn các vi mạch chuyên dụng, chẳng hạn như ADM202 cho RS-232.

Giao diện nối tiếp SPI

Tên SPI là viết tắt của "Bus ngoại vi nối tiếp", phản ánh mục đích của nó - một bus để kết nối các thiết bị bên ngoài. Bus SPI được tổ chức theo nguyên tắc master-slave. Bus master thường là một bộ vi điều khiển, nhưng nó cũng có thể là logic lập trình, bộ điều khiển DSP hoặc ASIC. Các thiết bị được kết nối với máy chủ là thiết bị phụ. Vai trò của chúng được thực hiện bởi nhiều loại vi mạch khác nhau, bao gồm cả. thiết bị lưu trữ (EEPROM, bộ nhớ Flash, SRAM), đồng hồ thời gian thực (RTC), ADC/DAC, chiết áp kỹ thuật số, bộ điều khiển chuyên dụng, v.v.

Khối xây dựng chính của giao diện SPI là một thanh ghi dịch chuyển thông thường, có tín hiệu đầu vào/đầu ra dòng bit đồng bộ hóa và tạo thành các tín hiệu giao diện. Vì vậy, sẽ đúng hơn nếu gọi giao thức SPI không phải là giao thức truyền dữ liệu mà là giao thức trao đổi dữ liệu giữa hai thanh ghi dịch chuyển, mỗi thanh ghi này đồng thời thực hiện cả chức năng của máy thu và máy phát. Điều kiện tiên quyết để truyền dữ liệu trên bus SPI là tạo ra tín hiệu đồng bộ hóa bus. Chỉ người lãnh đạo mới có quyền tạo ra tín hiệu này và công việc của nô lệ hoàn toàn phụ thuộc vào nó.

Sự liên quan.

Có ba loại kết nối với bus SPI, mỗi loại bao gồm bốn tín hiệu. Mục đích của tín hiệu SPI được mô tả trong Bảng 7.1.

Kết nối đơn giản nhất, chỉ bao gồm hai vi mạch, được minh họa trong Hình 7.2. Ở đây, bus chủ truyền dữ liệu dọc theo đường MOSI một cách đồng bộ với tín hiệu SCLK do nó tạo ra và bus phụ sẽ ghi lại các bit dữ liệu được truyền trên các cạnh nhất định của tín hiệu đồng bộ hóa nhận được. Đồng thời, Slave gửi gói dữ liệu của nó. Mạch được trình bày có thể được đơn giản hóa bằng cách loại bỏ đường MISO nếu IC phụ được sử dụng không cung cấp khả năng truyền dữ liệu phản hồi hoặc không cần thiết. Truyền dữ liệu một chiều có thể được tìm thấy trong các chip như DAC, chiết áp kỹ thuật số, bộ khuếch đại lập trình và trình điều khiển. Do đó, tùy chọn được xem xét để kết nối IC phụ cần có 3 hoặc 4 đường truyền.

Để IC phụ có thể nhận và truyền dữ liệu, ngoài việc có tín hiệu đồng hồ, đường SS cũng phải được điều khiển ở mức thấp. Nếu không, IC phụ sẽ không hoạt động. Khi chỉ sử dụng một IC bên ngoài, có thể loại bỏ đường SS bằng cách đẩy đầu vào chọn của IC phụ xuống mức thấp. Giải pháp này cực kỳ không mong muốn và có thể dẫn đến thất bại hoặc thậm chí không thể truyền dữ liệu, bởi vì Đầu vào chọn chip dùng để đặt lại IC về trạng thái ban đầu và đôi khi khởi tạo đầu ra của bit dữ liệu đầu tiên.

Nếu cần kết nối một số vi mạch với bus SPI, thì sử dụng kết nối độc lập (song song) (Hình 7.3) hoặc kết nối xếp tầng (nối tiếp) (Hình 7.4). Kết nối độc lập là phổ biến hơn, bởi vì đạt được khi sử dụng bất kỳ chip tương thích SPI nào. Ở đây, tất cả các tín hiệu, ngoại trừ việc lựa chọn các vi mạch, đều được kết nối song song và bus chủ, bằng cách chuyển một hoặc một tín hiệu SS khác sang trạng thái thấp, sẽ chỉ định IC phụ mà nó sẽ trao đổi dữ liệu. Nhược điểm chính của kết nối này là cần có thêm các đường dây để đánh địa chỉ các chip phụ (tổng số đường truyền là 3+n, trong đó n là số lượng chip phụ).

Nếu không có đủ chân vi điều khiển, bạn có thể sử dụng chip bộ tách kênh. Bộ tách kênh kết nối một tín hiệu đầu vào duy nhất với một trong các tín hiệu đầu ra, tùy thuộc vào mã trên các chân điều khiển. Hình 7.4 thể hiện sơ đồ kết nối của bộ tách kênh. Tín hiệu SS được cung cấp cho đầu vào của nó, tín hiệu này nhận giá trị bằng 0 nếu cần chọn một trong các vi mạch. Số lượng vi mạch cần thiết ở dạng mã nhị phân được cung cấp cho các chân Am-A0. Điều này cho phép bạn giảm số lượng chân được sử dụng trong bộ vi điều khiển xuống m=log 2 n. Trong đó n là số lượng chip phụ. Những thứ kia. để kết nối 128 thiết bị, cần có 8 chân vi điều khiển. Một để cài đặt tín hiệu kích hoạt và 7 để cài đặt số lượng chip được bật. Cần lưu ý rằng phải có một logic trên các chân không được kết nối của bộ phân kênh. Mặt khác, bộ biến tần tín hiệu được sử dụng, chuyển đổi số 0 logic thành số 0 logic.

Chuyển mạch theo tầng không gặp phải nhược điểm này, bởi vì ở đây, một số chip tạo thành một thanh ghi dịch lớn. Để thực hiện điều này, đầu ra dữ liệu truyền của một IC được kết nối với đầu vào nhận dữ liệu của IC kia, như trong Hình 3. Các đầu vào chọn chip ở đây được kết nối song song và do đó, tổng số đường truyền thông được giữ bằng nhau đến 4. Tuy nhiên, việc sử dụng kết nối tầng chỉ có thể thực hiện được nếu sự hỗ trợ của nó được nêu rõ trong tài liệu dành cho chip được sử dụng. Để tìm hiểu, điều quan trọng là phải biết rằng sự kết nối như vậy được gọi là "chuỗi xích" trong tiếng Anh.

Giao thức truyền tải

Giao thức truyền qua giao diện SPI về cơ bản giống với logic của thanh ghi dịch chuyển (Hình 7.6), bao gồm việc thực hiện thao tác dịch chuyển và theo đó, đầu vào và đầu ra bit của dữ liệu trên các cạnh nhất định của tín hiệu đồng bộ hóa. Cài đặt dữ liệu trong quá trình truyền và lấy mẫu trong quá trình nhận luôn được thực hiện trên các cạnh đồng hồ đối diện. Điều này là cần thiết để đảm bảo rằng dữ liệu được lấy mẫu sau khi nó được thiết lập một cách đáng tin cậy. Nếu chúng ta tính đến việc cạnh đầu tiên trong chu kỳ truyền có thể là cạnh tăng hoặc giảm, thì có bốn tùy chọn logic khả thi cho hoạt động của giao diện SPI. Các tùy chọn này được gọi là chế độ SPI và được mô tả bằng hai tham số:

· CPOL - mức ban đầu của tín hiệu đồng bộ hóa (nếu CPOL=0 thì đường đồng bộ trước khi bắt đầu chu kỳ truyền và sau khi kết thúc có mức thấp (tức là cạnh đầu tiên tăng lên và cạnh cuối cùng giảm xuống), ngược lại, nếu CPOL=1, - cao (tức là mặt trước đầu tiên giảm xuống và mặt trước cuối cùng tăng lên));

· CPHA - giai đoạn đồng bộ; Tham số này xác định trình tự dữ liệu được cài đặt và truy xuất. Nếu CPHA = 0 thì ở cạnh lên của chu kỳ xung nhịp, dữ liệu sẽ được lấy mẫu và sau đó ở cạnh xuống, dữ liệu sẽ được đặt. Nếu CPHA=1 thì việc cài đặt dữ liệu sẽ được thực hiện ở cạnh lên trong chu trình đồng bộ hóa và việc lấy mẫu sẽ được thực hiện ở cạnh xuống.

Thông tin về các chế độ SPI được trình bày trong Hình 7.7 và 7.8.

Chip chính và chip phụ hoạt động ở các chế độ SPI khác nhau không tương thích, do đó, trước khi chọn chip phụ, điều quan trọng là phải làm rõ chế độ nào được bus chủ hỗ trợ. Trong hầu hết các trường hợp, các mô-đun SPI phần cứng được tích hợp vào bộ vi điều khiển đều hỗ trợ khả năng chọn bất kỳ chế độ nào và do đó, mọi chip SPI phụ đều có thể được kết nối với chúng (chỉ áp dụng cho tùy chọn kết nối độc lập). Ngoài ra, giao thức SPI ở bất kỳ chế độ nào cũng có thể được thực hiện dễ dàng trong phần mềm.

Giao diện RS-485

Giao diện RS-485 (tên khác là EIA/TIA-485) là một trong những tiêu chuẩn lớp giao tiếp vật lý phổ biến nhất. Lớp vật lý là kênh liên lạc và phương thức truyền tín hiệu (lớp 1 của mô hình kết nối các hệ thống mở OSI).

Mạng được xây dựng trên giao diện RS-485 bao gồm các bộ thu phát được kết nối bằng cặp xoắn - hai dây xoắn. Giao diện RS-485 dựa trên nguyên tắc truyền dữ liệu vi sai (cân bằng). Bản chất của nó là truyền một tín hiệu qua hai dây. Hơn nữa, một dây (có điều kiện là A) mang tín hiệu gốc và dây kia (có điều kiện là B) mang bản sao nghịch đảo của nó. Nói cách khác, nếu một dây có số “1” thì dây kia có số “0” và ngược lại. Như vậy, luôn có sự chênh lệch điện thế giữa hai dây của một đôi dây xoắn: ở “1” là dương, ở “0” là âm (Hình 7.9).

Chính sự khác biệt tiềm năng này đã truyền tín hiệu. Phương pháp truyền này cung cấp khả năng miễn dịch cao đối với nhiễu chế độ chung. Nhiễu ở chế độ chung là nhiễu ảnh hưởng như nhau đến cả hai dây của đường dây. Ví dụ, một sóng điện từ truyền qua một phần của đường dây liên lạc sẽ tạo ra điện thế ở cả hai dây. Nếu tín hiệu được truyền bằng điện thế trong một dây so với dây chung, như trong RS-232, thì nhiễu trên dây này có thể làm biến dạng tín hiệu so với dây chung (mặt đất) giúp hấp thụ nhiễu tốt. Ngoài ra, chênh lệch điện thế nối đất sẽ giảm trên điện trở của một sợi dây dài thông thường - một nguồn gây biến dạng bổ sung. Và với bộ truyền vi sai, hiện tượng biến dạng sẽ không xảy ra. Trên thực tế, nếu hai dây nằm gần nhau, thậm chí đan xen vào nhau thì độ thu trên cả hai dây là như nhau. Điện thế ở cả hai dây được tải bằng nhau thay đổi như nhau, trong khi hiệu điện thế thông tin không thay đổi.

Triển khai phần cứng của giao diện RS485.

Triển khai phần cứng giao diện - chip thu phát với đầu vào/đầu ra vi sai (đến đường truyền) và cổng kỹ thuật số (tới cổng UART của bộ điều khiển). Có hai tùy chọn cho giao diện này: RS-422 và RS-485.

RS-422 là giao diện song công hoàn toàn. Việc thu và truyền xảy ra trên hai cặp dây riêng biệt. Chỉ có thể có một máy phát trên mỗi cặp dây.

RS-485 là giao diện bán song công. Việc thu và truyền xảy ra trên một cặp dây với khoảng cách thời gian. Có thể có nhiều bộ phát trong mạng vì chúng có thể bị tắt ở chế độ nhận (Hình 7.10).

Giải thích các ký hiệu ở hình 7.10

D (trình điều khiển) - máy phát;
R (máy thu) - máy thu;
DI (đầu vào trình điều khiển) - đầu vào kỹ thuật số của máy phát;
RO (đầu ra máy thu) - đầu ra kỹ thuật số của máy thu;
DE (kích hoạt trình điều khiển) - quyền vận hành máy phát;
RE (kích hoạt máy thu) - quyền vận hành máy thu;
A - đầu vào/đầu ra vi sai trực tiếp;
B - đầu vào/đầu ra vi sai nghịch đảo;
Y - đầu ra vi sai trực tiếp (RS-422);
Z - đầu ra vi sai nghịch đảo (RS-422).

Chúng ta hãy xem xét kỹ hơn về bộ thu phát RS-485. Đầu ra kỹ thuật số của máy thu (RO) được kết nối với cổng UART của máy thu (RX). Đầu vào kỹ thuật số của máy phát (DI) đến cổng máy phát UART (TX). Vì máy thu và máy phát được kết nối ở phía vi sai nên máy phát phải tắt trong quá trình thu và phải tắt máy thu trong quá trình truyền. Với mục đích này, đầu vào điều khiển được sử dụng - quyền của người nhận (RE) và quyền của người phát (DE). Vì đầu vào RE nghịch đảo nên nó có thể được kết nối với DE và chuyển đổi bộ thu và bộ phát bằng một tín hiệu từ bất kỳ cổng nào của bộ điều khiển. Ở mức "0" - hoạt động để thu, ở mức "1" - để truyền (Hình 7.11).

Máy thu, nhận được chênh lệch điện thế (UAB) ở đầu vào vi sai (AB), chuyển đổi chúng thành tín hiệu số ở đầu ra RO. Độ nhạy của máy thu có thể khác nhau, nhưng các nhà sản xuất chip thu phát ghi trong tài liệu phạm vi ngưỡng được đảm bảo để nhận dạng tín hiệu. Thông thường các ngưỡng này là ±200 mV. Tức là khi UAB > +200 mV - máy thu phát hiện "1" khi UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Tất cả các thiết bị được kết nối với một cáp xoắn đôi theo cùng một cách: đầu ra trực tiếp (A) với một dây, đầu ra nghịch đảo (B) với dây kia.

Trở kháng đầu vào của máy thu ở phía đường dây (RAB) thường là 12KΩ. Vì công suất máy phát không phải là vô hạn nên điều này tạo ra giới hạn về số lượng máy thu được kết nối với đường dây. Theo thông số kỹ thuật RS-485, có tính đến các điện trở đầu cuối, bộ phát có thể điều khiển tới 32 bộ thu. Tuy nhiên, có một số vi mạch có trở kháng đầu vào tăng, cho phép bạn kết nối đáng kể hơn 32 thiết bị với đường dây.

Tốc độ liên lạc tối đa theo thông số kỹ thuật RS-485 có thể đạt tới 10 Mbaud/giây. Khoảng cách tối đa là 1200 mét. Nếu cần tổ chức liên lạc ở khoảng cách hơn 1200 mét hoặc kết nối nhiều thiết bị hơn khả năng tải của máy phát cho phép, hãy sử dụng các bộ lặp đặc biệt.

Giao diện I2C.

Giao diện này do Philips đề xuất, hãng sử dụng nó để tổ chức liên lạc giữa các chip trong TV của mình. I 2 C (viết tắt của Inter-Integrated Circuit) là bus nối tiếp không đồng bộ hai chiều. Về mặt vật lý, bus I 2 C bao gồm hai đường tín hiệu, một trong số đó (SCL) được dùng để truyền tín hiệu đồng hồ và đường thứ hai (SDA) để trao đổi dữ liệu. Để điều khiển đường dây, các tầng đầu ra có bộ thu mở được sử dụng, do đó, đường dây bus phải được kết nối với nguồn điện +5 V thông qua các điện trở có điện trở 1...10 kOhm, tùy thuộc vào độ dài vật lý của đường dây và tốc độ truyền dữ liệu. Chiều dài đường kết nối ở chế độ tiêu chuẩn có thể đạt tới 2 mét, tốc độ truyền dữ liệu là 100 kbit/s.

Tất cả những người đăng ký xe buýt được chia thành hai hạng - “Người lãnh đạo” và “Nô lệ”. Thiết bị chính tạo ra tín hiệu đồng hồ (SCL). Nó có thể truy cập bus một cách độc lập và đánh địa chỉ bất kỳ thiết bị phụ nào nhằm mục đích truyền hoặc nhận thông tin. Tất cả các thiết bị phụ đều “lắng nghe” xe buýt để phát hiện địa chỉ của chính chúng và sau khi nhận ra địa chỉ đó, thực hiện thao tác được quy định. Ngoài ra, chế độ được gọi là “MultiMaster” có thể thực hiện được khi một số thiết bị chính được cài đặt trên bus, chúng cùng chia sẻ các thiết bị phụ chung hoặc luân phiên đóng vai trò là chủ khi chính chúng bắt đầu trao đổi thông tin hoặc là nô lệ khi họ đang chờ truy cập từ một thiết bị chính khác. Chế độ "MultiMaster" yêu cầu giám sát và ghi nhận xung đột liên tục. Về mặt này, chế độ này khó thực hiện hơn (nghĩa là triển khai phần mềm) và do đó, ít được sử dụng hơn trong các sản phẩm thực tế.

Tại thời điểm ban đầu - ở chế độ chờ - cả hai dòng SCL và SDA đều ở trạng thái logic (bóng bán dẫn của giai đoạn đầu ra cực thu hở bị đóng). Ở chế độ truyền (Hình 7.12), bit dữ liệu SDA được xung nhịp bởi cạnh lên của SCL. Thông tin trên đường SDA bị thay đổi khi đường SCL ở trạng thái 0. Ví dụ, thiết bị phụ có thể "giữ" đường SCL ở trạng thái 0 trong khi xử lý byte nhận được tiếp theo, trong khi thiết bị chính phải đợi cho đến khi đường SCL được giải phóng trước khi tiếp tục truyền thông tin.

Để đồng bộ hóa các gói bus I 2 C, hai điều kiện được phân biệt - “BẮT ĐẦU” và “STOP”, giới hạn phần đầu và phần cuối của gói thông tin (Hình 7.13). Để mã hóa các điều kiện này, người ta sử dụng sự thay đổi trạng thái của đường SDA bằng một trạng thái duy nhất của đường SCL, điều này không thể chấp nhận được khi truyền dữ liệu. Điều kiện “BẮT ĐẦU” được hình thành khi cạnh giảm dần xuất hiện trên đường SDA, khi đường SCL ở trạng thái duy nhất và ngược lại, điều kiện “STOP” được hình thành khi cạnh tăng xuất hiện trên đường SDA khi SCL dòng ở một trạng thái duy nhất.

Việc truyền dữ liệu bắt đầu ở sườn lên đầu tiên trên đường SCL, xung nhịp bit quan trọng nhất của byte thông tin đầu tiên. Mỗi byte thông tin (8 bit) chứa 9 chu kỳ xung nhịp của đường SCL. Ở chu kỳ thứ chín, thiết bị nhận đưa ra xác nhận (ACK) - cạnh xuống biểu thị việc nhận dữ liệu. Cần lưu ý rằng bất kỳ thuê bao bus nào, cả chủ và phụ, tại các thời điểm khác nhau có thể vừa là máy phát vừa là máy thu và, tùy theo chế độ, được yêu cầu nhận hoặc phát tín hiệu ACK, nếu không có tín hiệu này sẽ được hiểu là như một lỗi.

Để bắt đầu hoạt động trao đổi dữ liệu, thiết bị chủ sẽ đưa ra điều kiện "BẮT ĐẦU" trên bus. Theo sau điều kiện “BẮT ĐẦU” là một byte có địa chỉ của thiết bị phụ (Hình 7.14), bao gồm địa chỉ thiết bị bảy bit (bit 1...7) và cờ hoạt động đọc-ghi một bit - “ R/W” (bit 0). Bit R/W xác định hướng trao đổi, với 0 nghĩa là truyền dữ liệu từ master sang Slave (Hình 7.14a) và 1 nghĩa là đọc từ Slave (Hình 7.14b). Tất cả các bit trên bus I 2 C được truyền theo thứ tự từ cao xuống thấp, tức là bit thứ 7 được truyền trước, bit thứ 0 được truyền cuối cùng. Địa chỉ có thể được theo sau bởi một hoặc nhiều byte thông tin (theo hướng được chỉ định bởi cờ R/W), các bit của chúng được xung nhịp bởi master trên bus SCL.

Khi thực hiện thao tác đọc, máy chủ phải ACK byte đã đọc nếu nó muốn đọc byte tiếp theo và không đưa ra ACK nếu sắp đọc xong gói (xem Hình 7.14b).

Nó được phép tiếp tục địa chỉ của thiết bị phụ nhiều lần trong một chu kỳ truyền, nghĩa là truyền điều kiện “BẮT ĐẦU” lặp đi lặp lại mà không có điều kiện “STOP” trước đó (Hình 7.14c).

Cần lưu ý một số tính năng của chip nhớ hoạt động thông qua giao diện I 2 C và quy trình trao đổi dữ liệu với chúng. Đầu tiên, bộ nhớ dữ liệu cố định của các vi mạch này được chia thành các trang bộ nhớ, vì vậy khi một byte được ghi, toàn bộ trang đầu tiên sẽ được sao chép vào RAM bên trong của vi mạch, nơi ô mong muốn được thay đổi. Sau đó, trang cũ bị xóa và một trang mới được viết vào vị trí của nó. Một đặc điểm khác là bốn bit quan trọng nhất của địa chỉ nô lệ phải luôn bằng 1010. Yêu cầu này do chính Philips quy định.

Bus 1 dây chỉ sử dụng một dây dẫn để liên lạc và cấp nguồn. Chế độ giao tiếp là không đồng bộ và bán song công, tuân thủ nghiêm ngặt mô hình chủ-nô lệ. Một hoặc nhiều thiết bị phụ có thể được kết nối với cùng một xe buýt cùng một lúc. Chỉ có một thiết bị chính có thể được kết nối với một bus.

Trạng thái không tải của bus tương ứng với mức cao, được tạo ra bởi điện trở kéo lên. Giá trị của điện trở kéo lên được nêu trong tài liệu dành cho IC phụ. Tất cả các chip kết nối với bus phải có khả năng tạo ra mức thấp. Nếu đầu ra vi điều khiển không hỗ trợ ba trạng thái thì cần cung cấp trình điều khiển có đầu ra cực thu mở hoặc cống mở

Việc truyền tín hiệu qua bus 1-Dây được chia thành các khe thời gian có thời lượng 60 µs. Chỉ một bit dữ liệu được truyền trên mỗi khe thời gian. Các thiết bị phụ được phép có sự khác biệt đáng kể so với độ trễ thời gian định mức. Tuy nhiên, điều này đòi hỏi người lãnh đạo phải căn thời gian chính xác hơn để đảm bảo giao tiếp chính xác với cấp dưới có cơ sở thời gian khác nhau.

Tín hiệu xe buýt cơ bản

Master bắt đầu mỗi giao tiếp ở cấp độ bit. Điều này có nghĩa là việc truyền mọi bit, bất kể hướng nào, đều phải được khởi tạo bởi chủ. Điều này đạt được bằng cách đặt bus ở mức thấp, đồng bộ hóa logic của tất cả các thiết bị khác. Có 5 lệnh chính để liên lạc qua bus 1-Wire: “Write log. 1”, “Ghi nhật ký. 0”, “Đọc”, “Đặt lại” và “Hiện diện”.

Tín hiệu “Ghi nhật ký. 1"

Tín hiệu “Ghi nhật ký. 1” được thể hiện trong hình. 7.15. Master đặt mức thấp trong 1...15 µs. Sau đó, nó giải phóng bus trong khoảng thời gian còn lại.

Cơm. 7.15 – Tín hiệu “Ghi nhật ký. 1"

Tín hiệu “Ghi nhật ký. 0"

Tín hiệu “Ghi nhật ký. 0” được thể hiện trong Hình 7.16. Bản gốc tạo ra mức thấp trong ít nhất 60 µs, nhưng không dài hơn 120 µs.

Hình 7.16 – Tín hiệu “Ghi nhật ký. 0"

Đọc tín hiệu

Tín hiệu “Đọc” được hiển thị trong Hình 2. 7.17. Master đặt mức thấp trong 1...15 µs. Sau đó, Slave sẽ giữ bus ở mức thấp nếu nó muốn truyền một bản ghi. 0. Nếu cần chuyển nhật ký. 1, thì nó chỉ đơn giản là giải phóng dòng. Việc quét bus phải được thực hiện trong vòng 15 µs kể từ khi bus xuống thấp. Khi nhìn từ phía máy chủ, về bản chất, tín hiệu “Đọc” là tín hiệu “Ghi nhật ký”. 1". Trạng thái bên trong thực tế của Slave sẽ được xác định bằng tín hiệu “Record log”. 1" hoặc "Đọc".

Hình 7.17 – Tín hiệu “Đọc”

Tín hiệu đặt lại/hiện diện

Tín hiệu “Đặt lại” và “Hiện diện” được hiển thị trong Hình 7.18. Xin lưu ý rằng các khoảng thời gian xung là khác nhau. Master kéo xuống mức thấp trong 8 khe thời gian (480 µs) và sau đó giải phóng bus. Trạng thái thấp kéo dài này được gọi là tín hiệu "Đặt lại".

Nếu một nô lệ có mặt trên bus, trong vòng 60 µs sau khi master giải phóng bus, nó phải đặt mức thấp trong ít nhất 60 µs. Phản ứng này được gọi là “Sự hiện diện”. Nếu tín hiệu như vậy không được phát hiện thì thiết bị chủ phải cho rằng không có thiết bị nào được kết nối với bus và không thể liên lạc thêm nữa.

USB (Universal serial bus) được phát triển để kết nối nhanh chóng các thiết bị bên ngoài với máy tính cá nhân, sau đó tìm và cài đặt phần mềm cần thiết. Các thiết bị năng lượng thấp được cấp nguồn trực tiếp thông qua giao diện.

Tiêu chuẩn USB ngụ ý sự hiện diện của chỉ một thiết bị Master (Host) trên mạng. Hơn nữa, tiêu chuẩn này hỗ trợ tới 127 thiết bị nô lệ trên mạng. Để phân biệt giữa thiết bị chính và thiết bị phụ, nhiều loại đầu nối khác nhau đã được phát triển (Hình 7.19): Loại A cho thiết bị chính và Loại B cho thiết bị phụ. Người ta chấp nhận rằng điện áp 5V chỉ xuất hiện ở đầu nối loại A, là đầu nối chính. Các thiết bị còn lại được cấp nguồn trực tiếp từ nó.

Chuẩn USB sử dụng 4 dây được bảo vệ, trong đó có 2 dây truyền nguồn (+5v & GND) (Hình 7.19 và Bảng 7.2). Hai cái còn lại đại diện cho tín hiệu dữ liệu vi sai cặp xoắn. Sơ đồ mã hóa được sử dụng NRZI(Đảo ngược không trở về 0) để truyền dữ liệu với trường đồng bộ hóa để đồng bộ hóa đồng hồ chính và đồng hồ phụ.

Chuẩn USB 2.0 đã giới thiệu chuẩn On-The-Go (OTG), chuẩn này đã giới thiệu Giao thức đàm phán máy chủ, cho phép hai thiết bị USB thống nhất xem ai sẽ đóng vai trò là chủ. Điều này nhằm mục đích và giới hạn ở các kết nối điểm-điểm đơn lẻ, chẳng hạn như điện thoại di động với máy tính cá nhân.

USB hỗ trợ kết nối “nóng” (plug’n’play) với trình điều khiển được tải và không tải động. Người dùng chỉ cần cắm thiết bị vào, từ đó kết nối thiết bị với xe buýt. Máy chủ phát hiện kết nối, thăm dò thiết bị mới được cắm và tải trình điều khiển thích hợp, cho biết thời điểm tải bằng đồng hồ cát trên màn hình (nếu trình điều khiển cho thiết bị USB đã được cài đặt trên hệ thống). Người dùng cuối không quan tâm đến việc chấm dứt hoặc IRQ(ngắt) và địa chỉ cổng cũng như về việc khởi động lại máy tính (không cần khởi động lại). Khi người dùng sử dụng xong thiết bị USB, họ chỉ cần tháo nó ra (hoặc rút cáp), máy chủ sẽ phát hiện sự vắng mặt của thiết bị và tự động dỡ driver.

SB phiên bản 1.1 hỗ trợ hai tốc độ - chế độ tốc độ đầy đủ với tốc độ 12 Mbits/s và chế độ tốc độ thấp với tốc độ 1,5 Mbits/s. Chế độ 1,5 Mbits/s chậm hơn và ít nhạy cảm hơn với EMI (nhiễu), giúp giảm chi phí của hạt ferit và giảm yêu cầu về chất lượng thành phần.

Cáp bus tốc độ đầy đủ là cáp xoắn đôi, được bảo vệ bởi tấm chắn và cũng có thể được sử dụng để hoạt động ở tốc độ thấp. Cáp chỉ hoạt động ở tốc độ tối thiểu (ví dụ: để kết nối chuột) có thể là bất kỳ loại nào và không được che chắn.

Chuẩn USB 2.0 giới thiệu chế độ Tốc độ cao với tốc độ truyền dữ liệu 480Mbits/s.

Truyền dữ liệu.

Tất cả việc truyền dữ liệu qua giao diện đều được khởi tạo bởi máy chủ. Dữ liệu được truyền dưới dạng gói. Giao diện USB sử dụng một số loại gói:

A) ký gói (gói mã thông báo) mô tả loại và hướng truyền dữ liệu, địa chỉ thiết bị và số sê-ri của điểm cuối (CT là phần có thể định địa chỉ của thiết bị USB); Các gói tính năng có nhiều loại: TRONG, NGOÀI, SOF, CÀI ĐẶT;

B) gói dữ liệu (gói dữ liệu) chứa dữ liệu được truyền đi;

B) gói phê duyệt (gói bắt tay) nhằm mục đích báo cáo kết quả truyền dữ liệu; Có một số loại gói phối hợp: ACK, N.A.K., QUẦY HÀNG.

Việc truyền dữ liệu qua USB được thực hiện như sau:

Gói đầu tiên, còn gọi là mã thông báo, được thiết bị chính tạo ra để mô tả loại dữ liệu được truyền, hoạt động truyền (đọc hoặc ghi), địa chỉ thiết bị và điểm cuối. Tiếp theo thường được truyền là gói dữ liệu mang thông tin hữu ích, theo sau là gói bắt tay cho biết dữ liệu hoặc mã thông báo đã được nhận thành công hoặc điểm cuối bị đình trệ hoặc không có sẵn để chấp nhận dữ liệu.

Điểm cuối trong tiêu chuẩn USB là nguồn và nơi chứa dữ liệu. Tất cả các thiết bị phải hỗ trợ điểm cuối 0. Đây là điểm cuối chấp nhận tất cả các yêu cầu điều khiển và trạng thái trong quá trình liệt kê (yêu cầu xử lý để xác định loại thiết bị được đính kèm) và miễn là thiết bị vẫn hoạt động trên xe buýt.

Điểm cuối được đánh số từ 1 được sử dụng để truyền thông tin người dùng. Hãy xem xét một vài ví dụ.

Trình điều khiển thiết bị truyền tới điểm cuối thiết bị chính EP1. Bởi vì Thiết bị này là thiết bị chính, sau đó dữ liệu sẽ được đưa vào bộ đệm OUT EP1. Trong trường hợp này, mã thông báo OUT được gửi, cho biết dữ liệu đã sẵn sàng được gửi. Sau khi nhận được mã thông báo này, thiết bị phụ có thể đọc dữ liệu từ bộ đệm OUT.

Nếu thiết bị phụ cần truyền dữ liệu đến thiết bị chủ, nó sẽ đặt dữ liệu đó vào bộ đệm IN. Bộ đệm này sẽ giữ dữ liệu cho đến khi thiết bị chủ gửi mã thông báo IN yêu cầu dữ liệu từ điểm cuối. Tất cả các bộ đệm điểm cuối đều được đặt tên tương ứng với bộ đệm chính, tức là. Bộ đệm đầu ra của thiết bị phụ được gọi là IN vì nó là bộ đệm đầu vào cho thiết bị chính.

Việc truyền dữ liệu từ điểm cuối này sang điểm cuối khác được thực hiện thông qua các luồng. Luồng – Một kết nối logic giữa máy chủ và (các) điểm cuối.

Các luồng cũng có một tập hợp các tham số như loại truyền (Điều khiển, Hàng loạt, Iso hoặc Ngắt), hướng luồng dữ liệu và kích thước gói/bộ đệm tối đa.

Ví dụ: luồng mặc định là luồng hai chiều bao gồm điểm cuối IN 0 và điểm cuối OUT 0 với điều khiển kiểu truyền.

USB xác định hai loại ống

A) Ống dẫn dòng không có định dạng USB được xác định trước, vì vậy bạn có thể gửi bất kỳ loại dữ liệu nào qua đường ống truyền phát và khôi phục dữ liệu ở đầu bên kia. Các luồng dữ liệu tuần tự và có hướng xác định trước - IN hoặc OUT. Ống dẫn dòng hỗ trợ các kiểu truyền số lượng lớn, đẳng thời và gián đoạn. Ống dẫn dòng có thể được điều khiển từ máy chủ hoặc thiết bị.

B) Ống thông báo có định dạng USB được xác định trước. Chúng được máy chủ kiểm soát, được khởi tạo bởi một yêu cầu được gửi từ máy chủ. Dữ liệu được gửi theo hướng mong muốn được chỉ định trong yêu cầu. Do đó, các đường dẫn thông báo cho phép dữ liệu được truyền theo cả hai hướng nhưng chỉ hỗ trợ truyền điều khiển.

Chuẩn USB mô tả bốn loại truyền dữ liệu:

A) Kiểm soát chuyển tiếp (chuyển giao quyền kiểm soát) được sử dụng cho cấu hình thiết bị cũng như các mục đích dành riêng cho thiết bị khác.

B) Truyền phát (chuyển giao số lượng lớn) được sử dụng để truyền một lượng thông tin tương đối lớn.

B) Chuyển tiếp ngắt (chuyển tiếp bị gián đoạn) được sử dụng để truyền một lượng thông tin tương đối nhỏ, việc truyền tải kịp thời là rất quan trọng. Nó có thời lượng giới hạn và mức độ ưu tiên cao hơn so với các loại chuyển khoản khác.

D) Chuyển tiếp đẳng thời (truyền đẳng thời) còn được gọi là phát trực tuyến thời gian thực. Thông tin được truyền trong quá trình truyền như vậy đòi hỏi quy mô thời gian thực trong quá trình tạo, truyền và nhận.

Truyền trực tuyến chuyển khoản được đặc trưng bởi việc truyền dữ liệu được đảm bảo không có lỗi giữa máy chủ và chức năng bằng cách phát hiện lỗi trong quá trình truyền và yêu cầu lại thông tin. Khi máy chủ sẵn sàng nhận dữ liệu từ một chức năng, nó sẽ gửi gói cờ đến chức năng đó TRONG-túi nhựa. Để đáp ứng điều này, chức năng trong giai đoạn truyền dữ liệu sẽ truyền một gói dữ liệu đến máy chủ hoặc, nếu nó

Trong bài viết này, tôi muốn giới thiệu tổng quan ngắn gọn về bus SPI (một giao diện được sử dụng rộng rãi trong công nghệ nhúng, dùng để kết nối nhiều thiết bị khác nhau) và cố gắng mô tả quá trình tạo trình điều khiển cấp độ giao thức thiết bị SPI cho Linux. Tài liệu này không nhằm mục đích hướng dẫn đầy đủ mà nhằm mục đích chỉ ra hướng đi đúng đắn. Vì bài viết không phù hợp với một chủ đề nên tôi phải chia làm hai phần.

0. Thay vì giới thiệu

Đây là loại bài viết gì?
Bài viết này là sự tổng hợp thông tin từ nhiều nguồn khác nhau, bản dịch miễn phí một số phần của tài liệu cũng như những nhận xét, bổ sung và mô tả của riêng tôi về các vấn đề phát sinh.

Bài viết này dành cho ai?
Trước hết, dành cho người mới bắt đầu, đó là tôi. Trên các diễn đàn Linux nhúng, bạn thường có thể gặp câu hỏi: “Làm cách nào tôi có thể làm việc với SPI trên bo mạch này?” Đây chính xác là những gì tôi sẽ cố gắng trả lời. Để làm ví dụ, tôi sẽ đưa ra mã được viết để hoạt động với thiết bị SPI thử nghiệm của mình.

Cấu trúc bài viết
Do có khá nhiều thông tin nên bài viết được chia thành nhiều phần nhỏ:

  1. SPI là gì?
  2. Tổng quan về hệ thống con SPI trong Linux
  3. Phát triển trình điều khiển SPI giao thức không gian người dùng bằng spidev
  4. Phát triển trình điều khiển giao thức SPI cấp hạt nhân
  5. Tài liệu
Hai điểm đầu tiên sẽ được đưa vào phần đầu tiên của bài viết, những điểm còn lại sẽ được đưa vào phần thứ hai.

Tiểu mục đầu tiên mô tả hoạt động của bus SPI, phần này của bài viết không gắn liền với Linux nên những người không quan tâm đến Linux có thể đọc được mà chỉ cần lấy thông tin về giao diện này.

Tiểu mục thứ hai mô tả các cấu trúc và cơ chế hoạt động cơ bản với SPI trong Linux; tiểu mục này phải được đọc để hiểu những gì sẽ được thảo luận trong phần thứ ba và thứ tư.

Nếu bạn không quan tâm đến các bản dịch và bổ sung của tôi, bạn có thể yên tâm chuyển thẳng sang phần thứ năm, nơi bạn có thể tìm thấy thông tin về nơi có được tất cả thông tin cần thiết về vấn đề này.

Lỗi
Tôi không phải là ảo thuật gia, tôi chỉ đang học thôi. Nếu bạn tìm thấy bất kỳ sai sót hoặc không chính xác, xin vui lòng cho tôi biết.

1. SPI là gì?

SPI viết tắt có nghĩa là “Giao diện ngoại vi nối tiếp” hoặc trong phiên bản tiếng Nga là “giao diện ngoại vi nối tiếp”. Cái tên đã nói lên điều đó; giao diện này được sử dụng để hoạt động với nhiều thiết bị ngoại vi khác nhau. Ví dụ: đây có thể là nhiều DAC/ADC, chiết áp, cảm biến, bộ mở rộng cổng đầu vào/đầu ra (GPIO), nhiều bộ nhớ khác nhau và thậm chí cả các thiết bị ngoại vi phức tạp hơn như codec âm thanh và bộ điều khiển Ethernet.

Từ quan điểm kỹ thuật, SPI là một bus bốn dây đồng bộ. Nó là sự kết nối của hai thanh ghi dịch chuyển đồng bộ, là thành phần trung tâm của bất kỳ thiết bị SPI nào. Kết nối sử dụng cấu hình chính/phụ. Chỉ có chủ mới có thể tạo xung đồng bộ hóa. Luôn chỉ có một chủ trong mạch (không giống như cùng một bus I2C, trong đó có thể có tùy chọn có nhiều hơn một chủ), số lượng nô lệ có thể khác nhau. Nói chung, đầu ra chính được kết nối với đầu vào phụ và ngược lại, đầu ra phụ được kết nối với đầu vào chính. Khi các xung đồng hồ được áp vào đầu ra SCK, dữ liệu sẽ được chủ đẩy ra khỏi đầu ra MOSI và được ghi lại bởi phụ ở đầu vào MISO. Do đó, nếu bạn áp dụng số xung đồng bộ hóa tương ứng với kích thước bit của thanh ghi dịch chuyển thì dữ liệu trong các thanh ghi sẽ hoán đổi vị trí. Theo đó SPI luôn hoạt động ở chế độ song công hoàn toàn. Nhưng liệu chúng ta có cần dữ liệu nhận được từ thiết bị khi ghi bất kỳ thông số nào hay không lại là một câu hỏi khác. Điều thường xảy ra là dữ liệu nhận được từ thiết bị khi ghi dữ liệu vào thiết bị là rác, trong trường hợp đó chúng chỉ bị bỏ qua, nhưng chúng ta sẽ nhận được chúng bất kể mong muốn của chúng ta là gì.

Bộ điều khiển SPI thường được triển khai dưới dạng thiết bị ngoại vi trong MCU hoặc eMPU. Trong hầu hết các chip, nó có thể hoạt động ở chế độ chính hoặc phụ. Nhưng hiện tại Linux chỉ hỗ trợ chế độ Master.

Có một số cách để kích hoạt các thiết bị SPI.

Đơn giản nhất trong số đó bạn có thể thấy trong hình trên (cảm ơn Wikipedia về những bức ảnh theo giấy phép GFDL miễn phí). Trong trường hợp này, tất cả các máy phụ được kết nối song song với máy chủ, ngoại trừ tín hiệu chọn máy phụ (~CS). Mỗi nô lệ yêu cầu một tín hiệu chọn nô lệ riêng biệt (có nhãn SSx trong hình). Đối với các tín hiệu lựa chọn phụ, có thể sử dụng đầu ra bộ điều khiển SPI chuyên dụng hoặc cổng đầu vào/đầu ra cho mục đích chung (GPIO) trên bộ vi điều khiển.

Hai dây được sử dụng để truyền dữ liệu, một dây để cung cấp xung đồng hồ và một tín hiệu chọn nô lệ cho mỗi nô lệ.
Mô tả các tín hiệu được sử dụng:

  • MOSI - Đầu ra chính, Đầu vào phụ (đầu ra chính, đầu vào phụ). Tín hiệu này dùng để truyền dữ liệu nối tiếp từ master tới Slave. Cũng có thể được gọi là SDO, DO, v.v.
  • MISO - Đầu vào chính, Đầu ra phụ (đầu vào chính, đầu ra phụ). Tín hiệu này dùng để truyền dữ liệu nối tiếp từ Slave tới Master. Có thể được gọi là SDI, DI, v.v.
  • SCK - Serial Clock (tín hiệu đồng bộ). Được sử dụng để đồng bộ hóa trong quá trình truyền dữ liệu. Nó cũng có thể được gọi là SCLK, CLK, v.v.
  • ~CS - Chọn chip (chọn chip). Tín hiệu này kích hoạt thiết bị phụ. Thông thường nó là nghịch đảo, nghĩa là mức thấp được coi là hoạt động. Đôi khi nó được gọi là ~SS (Lựa chọn nô lệ, “lựa chọn nô lệ” trong tiếng Nga).

Trường hợp đặc biệt của kết nối độc lập là tùy chọn với một thiết bị phụ duy nhất. Trong trường hợp này, bạn có thể muốn kéo tín hiệu ~CS xuống đất để thiết bị luôn ở trạng thái hoạt động. Nhưng điều này không được khuyến khích vì thiết bị phụ có thể sử dụng tín hiệu CS để khởi tạo hoặc cho các mục đích dịch vụ khác.

Nhược điểm chính của việc kết nối các nô lệ một cách độc lập là mỗi nô lệ yêu cầu một tín hiệu ~CS riêng. Sơ đồ nối tầng mà văn học nước ngoài gọi là “chuỗi cúc” (có thể dịch là “vòng hoa”) không có nhược điểm như vậy.

Như bạn có thể thấy trong hình trên, điều này sử dụng tín hiệu chọn nô lệ chung cho tất cả các nô lệ. Đầu ra của mỗi nô lệ được kết nối với đầu vào của nô lệ tiếp theo. Đầu ra của Slave cuối cùng được kết nối với đầu vào của Master, do đó tạo thành một mạch kín. Với kết nối này, chúng ta có thể coi các thiết bị được kết nối nối tiếp tạo thành một thanh ghi dịch lớn. Theo đó, dữ liệu có thể được ghi vào tất cả các thiết bị “trong một lần”, trước đó đã thu thập gói cần thiết kết hợp dữ liệu cho từng thiết bị theo thứ tự tương ứng với thứ tự vật lý của kết nối. Nhưng có một điểm tinh tế ở đây. Thứ nhất, tất cả các chip đều phải hỗ trợ kiểu kết nối này; thứ hai, nhân Linux không hỗ trợ kiểu kết nối này nên nếu vẫn muốn sử dụng nó, bạn sẽ phải sửa đổi trình điều khiển hiện có hoặc tự viết trình điều khiển của riêng mình.

Có bốn chế độ hoạt động cho thiết bị SPI. Theo quy định, chúng là những thứ gây nhầm lẫn nhất cho những người mới bắt đầu. Bốn chế độ này là sự kết hợp của hai bit:

  • CPOL (Clock Polarity) - xác định mức (cực) ban đầu của tín hiệu đồng hồ.
    CPOL=0 chỉ ra rằng tín hiệu đồng hồ bắt đầu ở mức thấp, do đó cạnh đầu tăng lên và cạnh cuối giảm xuống.
    CPOL=1, tín hiệu đồng hồ bắt đầu ở mức cao, do đó cạnh đầu giảm xuống và cạnh cuối tăng lên.
  • CPHA (Clock Phase) - giai đoạn đồng bộ hóa xác định cạnh nào của tín hiệu đồng hồ được sử dụng để lấy mẫu dữ liệu.
    CPHA=0 chỉ ra rằng cần phải lấy mẫu ở cạnh đầu và
    CPHA=1 chỉ ra rằng dữ liệu phải được lấy mẫu ở cạnh xuống.
Hai bit này tạo thành số chế độ. CPOL là bit có trọng số cao nhất và CPHA là bit có trọng số thấp nhất. Đôi khi tài liệu của thiết bị không chỉ rõ số chế độ nhưng luôn có thể dễ dàng xác định nó từ biểu đồ thời gian. Điều quan trọng là phải hiểu rằng việc lấy mẫu và cài đặt dữ liệu luôn xảy ra ở các cạnh đối diện của tín hiệu đồng hồ. Ví dụ: để thiết bị của chúng tôi hoạt động ở chế độ 0 (tùy chọn phổ biến nhất), trong trường hợp này thiết bị phụ sẽ đọc một bit dữ liệu từ đầu vào MOSI ở cạnh lên hàng đầu của tín hiệu đồng hồ và thiết bị chính sẽ đọc dữ liệu từ nô lệ ở đầu vào MISO cũng ở cạnh tăng lên hàng đầu. Để rõ ràng hơn, tôi sẽ cung cấp biểu đồ dao động cho cả bốn chế độ hoạt động:

Hình này hiển thị tín hiệu MOSI (đường màu xanh) và SCK (đường màu vàng). Trong mọi trường hợp, số 0x64 được truyền đi. Các đường thẳng đứng sáng cho biết thời điểm dữ liệu được lấy mẫu. Hãy xem xét chế độ 2, trong đó, như chúng ta nhớ, CPOL=1 và CPHA=0. Do đó, chúng ta thấy rằng tín hiệu đồng bộ hóa ban đầu có mức cao và việc lấy mẫu được thực hiện dọc theo cạnh đầu (trong trường hợp này là cạnh xuống). Vì máy hiện sóng của tôi chỉ có hai kênh nên tín hiệu ~CS và MISO không được hiển thị. Nhưng trong trường hợp này, chúng không mấy thú vị, chẳng hạn, tín hiệu ~CS chỉ đơn giản là “lỗi” trong toàn bộ quá trình truyền dữ liệu.

2. Tổng quan về hệ thống con SPI trong Linux

Trình điều khiển SPI trong Linux được chia thành hai phần. Đầu tiên là trình điều khiển bộ điều khiển SPI hoạt động trực tiếp với phần cứng của bộ điều khiển cụ thể. Các trình điều khiển như vậy xác định cách định cấu hình bộ điều khiển, những hành động cần thực hiện khi vào chế độ năng lượng thấp (tạm dừng) và thoát khỏi chế độ đó (tiếp tục), chọn lần truyền tiếp theo (spi_transfer) từ hàng đợi truyền trong tin nhắn (spi_message, về hàng đợi bên dưới) và gửi nó trực tiếp đến một cổng, cũng được định nghĩa là kích hoạt/hủy kích hoạt một thiết bị cụ thể thông qua CS (chức năng cs_activate/cs_deactivate). Trong bài viết này tôi sẽ không mô tả loại trình điều khiển này. Theo quy định, chúng đã được triển khai cho các MCU/eMPU có cổng Linux và bạn chỉ cần truy cập chúng nếu cần một số chức năng cụ thể, như Giải mã chọn chip, để có thể kích hoạt thiết bị phụ mong muốn thông qua logic bên ngoài. Đôi khi điều này rất hữu ích, chẳng hạn như trong trường hợp thiếu GPIO.

Phần thứ hai là trình điều khiển giao thức được sử dụng để hoạt động với nhiều thiết bị phụ khác nhau được kết nối với bus SPI. Các trình điều khiển này được gọi là trình điều khiển "giao thức" vì chúng chỉ gửi và nhận nhiều dữ liệu khác nhau từ các thiết bị phụ mà không làm việc trực tiếp với bất kỳ phần cứng nào. Đây là loại trình điều khiển thú vị nhất đối với chúng tôi, vì nó cho phép chúng tôi thêm hỗ trợ cho thiết bị nô lệ mà hệ thống quan tâm, đây là điều chúng tôi sẽ xem xét.

Hầu hết các trình điều khiển giao thức đều là mô-đun hạt nhân. Ví dụ: nếu thiết bị là codec âm thanh được kết nối qua SPI thì trình điều khiển cũng sẽ sử dụng các chức năng do ALSA cung cấp và các chương trình (ví dụ: madplay) sẽ có thể hoạt động với thiết bị đó thông qua thiết bị ký tự /dev/audio, mà không cần biết chút gì về cách nó được tích hợp trong phần cứng và nó được kết nối với bus nào.

Hạt nhân cũng cung cấp trình điều khiển giao thức có mục đích chung được gọi là spidev với giao diện thiết bị ký tự. Nó cho phép bạn thực hiện các cuộc gọi bán song công đến thiết bị phụ SPI bằng cách sử dụng các lệnh gọi hệ thống read() và write() tiêu chuẩn, đặt chế độ vận hành và cũng thực hiện trao đổi dữ liệu song công hoàn toàn bằng các lệnh gọi ioctl().

Như vậy, trình điều khiển giao thức cho thiết bị SPI có thể được chia thành hai loại:

  • trình điều khiển không gian người dùng hoạt động trong không gian người dùng và là các chương trình thông thường bằng bất kỳ ngôn ngữ nào hoạt động với thiết bị SPI bằng cách đọc/ghi thiết bị ký tự spidev tương ứng.
  • Trình điều khiển chạy trong không gian hạt nhân và cung cấp giao diện cho không gian người dùng thông qua các tệp thiết bị trong thư mục /dev hoặc thông qua các thuộc tính trong thư mục thiết bị trong sysfs.
Linux xếp hàng tất cả các cuộc gọi đến thiết bị SPI. Trình điều khiển giao thức SPI hoạt động rõ ràng hoặc ngầm định với các thông báo được biểu thị bằng cấu trúc struct spi_message, là một giao dịch SPI nhiều phân đoạn.
struct spi_message ( struct list_head chuyển; struct spi_device *spi; unsigned is_dma_mapped:1; void (*complete)(void *context); void *context; unsigned REAL_length; int status; struct list_head queue; void *state; );
chuyển khoản - danh sách liên kết các phân đoạn được chuyển giao trong một giao dịch (chuyển khoản);
spi - con trỏ tới thiết bị spi có hàng đợi chứa thông báo này;
is_dma_maped - nếu cờ này đúng thì cả địa chỉ ảo dma và cpu đều được cung cấp cho mỗi bộ đệm truyền;
hoàn thành - một cuộc gọi lại được gọi để cho biết sự kết thúc của giao dịch;
bối cảnh - đối số cho lệnh gọi lại Complete();
thực tế_length - tổng số byte đã được truyền trong tất cả các lần truyền thành công;
trạng thái - 0 trong trường hợp thành công hoặc giá trị âm có lỗi trong trường hợp có lỗi;

thẻ:

  • linux
  • gián điệp
  • gián điệp
  • nhúng
  • mô-đun hạt nhân
Thêm thẻ

Với xếp hạng từ 10 Ohm đến 1 MOhm);

  • dây kết nối (ví dụ: đây là một bộ tốt);
  • máy tính cá nhân với môi trường phát triển Arduino IDE.
  • 1 Mô tả nối tiếp giao diện SPI

    SPI - Giao diện ngoại vi nối tiếp hoặc “Giao diện ngoại vi nối tiếp” là một giao thức truyền dữ liệu đồng bộ để ghép nối thiết bị chủ Với thiết bị ngoại vi (Slave). Thiết bị chính thường là một bộ vi điều khiển. Giao tiếp giữa các thiết bị xảy ra qua bốn dây, đó là lý do tại sao SPI đôi khi được gọi là “giao diện bốn dây”. Đây là những chiếc lốp xe:

    Có bốn chế độ truyền dữ liệu ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), gây ra bởi sự kết hợp giữa cực tính của các xung đồng hồ (chúng tôi làm việc ở mức CAO hoặc THẤP), Phân cực đồng hồ, CPOL và pha của xung đồng hồ (đồng bộ hóa ở cạnh tăng hoặc giảm của xung đồng hồ), Pha đồng hồ, CPHA.

    Hình giải thích bảng này.

    Giao diện SPI cung cấp một số tùy chọn để kết nối các thiết bị phụ: độc lậpthác nước. Khi được kết nối độc lập với bus SPI, thiết bị chính sẽ truy cập riêng lẻ từng thiết bị phụ. Với kết nối theo tầng, các thiết bị phụ hoạt động từng cái một, như thể theo tầng.


    Các loại kết nối thiết bị để vận hành qua giao diện SPI: độc lập và xếp tầng

    2 Triển khai giao diện SPI trên bo mạch gia đình Arduino

    Trong Arduino, bus giao diện SPI được đặt trên các cổng cụ thể. Mỗi bảng có sự phân công pin riêng. Để thuận tiện, các kết luận được sao chép và cũng được đặt trên một ngăn riêng. Đầu nối ICSP(Trong Lập trình nối tiếp mạch, lập trình một thiết bị có trong mạch bằng giao thức nối tiếp). Xin lưu ý rằng đầu nối ICSP không có chân chọn phụ - SS, vì người ta cho rằng Arduino sẽ được sử dụng như một thiết bị chính trong mạng. Nhưng nếu cần, bạn có thể gán bất kỳ chân kỹ thuật số nào của Arduino là SS.

    Hình này cho thấy sự tương ứng tiêu chuẩn của các chân với bus SPI cho Arduino UNO và Nano.


    3 Thư viện cho công việc với giao diện SPI

    Một thư viện đặc biệt đã được viết cho Arduino triển khai giao thức SPI. Nó kết nối như thế này: vào đầu chương trình, chúng tôi thêm #include SPI.h.

    Để bắt đầu sử dụng giao thức SPI, bạn cần đặt cài đặt và sau đó khởi tạo giao thức bằng quy trình SPI.beginTransaction(). Bạn có thể làm điều này với một hướng dẫn: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    Điều này có nghĩa là chúng tôi khởi tạo giao thức SPI ở tần số 14 MHz, việc truyền dữ liệu xảy ra bắt đầu từ MSB (bit quan trọng nhất), ở chế độ SPI_MODE0.

    Sau khi khởi tạo, chọn thiết bị phụ bằng cách di chuyển chân SS tương ứng sang trạng thái THẤP.

    Sau đó chúng ta chuyển dữ liệu sang thiết bị phụ bằng lệnh SPI.transfer().

    Sau khi chuyển, chúng tôi trả SS về trạng thái CAO.


    Làm việc với giao thức được hoàn thành bằng lệnh SPI.endTransaction().

    Bạn nên giảm thiểu thời gian truyền giữa các lệnh SPI.beginTransaction() và SPI.endTransaction() để tránh sự cố nếu thiết bị khác cố gắng bắt đầu truyền dữ liệu bằng các cài đặt khác.

    4 Kết nối một thanh ghi thay đổiđến Arduino

    Hãy xem xét ứng dụng thực tế của giao diện SPI. Chúng tôi sẽ thắp sáng đèn LED bằng cách điều khiển thanh ghi dịch chuyển 8 bit thông qua bus SPI. Hãy kết nối với Arduino thanh ghi dịch chuyển 74HC595. Chúng tôi sẽ kết nối một đèn LED có giá trị danh nghĩa là 220 Ohms với mỗi đầu ra trong số 8 đầu ra thanh ghi thông qua một điện trở giới hạn. Sơ đồ được thể hiện trong hình.


    5 Phác thảo để kiểm soát một thanh ghi thay đổi thông qua giao diện SPI

    Hãy viết một bản phác thảo như thế này.

    #bao gồm const int pinSelect = 8; // đăng ký chọn pin thiết lập void() ( SPI.begin(); // khởi tạo giao diện SPI pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, THẤP); // chọn thiết bị phụ (đăng ký) SPI.transfer(0); // xóa nội dung của thanh ghi digitalWrite(pinSelect, HIGH); // kết thúc quá trình truyền Serial.begin(9600); } vòng lặp trống() ( vì (int i=0; i )

    Đầu tiên chúng ta hãy kết nối thư viện SPI và khởi tạo giao diện SPI. Hãy xác định chân 8 là chân chọn phụ SS. Hãy xóa thanh ghi thay đổi bằng cách gửi giá trị "0" tới nó. Khởi tạo cổng nối tiếp.

    Để thắp sáng một đèn LED cụ thể bằng thanh ghi thay đổi, bạn cần áp dụng số 8 bit cho đầu vào của nó. Ví dụ: để đèn LED đầu tiên sáng lên, chúng tôi cung cấp số nhị phân 00000001, cho số thứ hai - 00000010, cho số thứ ba - 00000100, v.v. Các số nhị phân này khi chuyển sang hệ thập phân sẽ tạo thành dãy sau: 1, 2, 4, 8, 16, 32, 64, 128 và là lũy thừa của hai từ 0 đến 7.

    Theo đó, trong chu kỳ vòng() Dựa vào số lượng đèn LED ta tính lại từ 0 đến 7. pow(cơ sở, mức độ) Tăng 2 lên lũy thừa của bộ đếm vòng lặp. Bộ vi điều khiển hoạt động không chính xác lắm với các số thuộc loại "kép", vì vậy chúng tôi sử dụng hàm làm tròn để chuyển kết quả thành số nguyên tròn(). Và chúng tôi chuyển số kết quả vào thanh ghi thay đổi. Để rõ ràng, màn hình cổng nối tiếp hiển thị các giá trị thu được trong thao tác này: Thiết bị “chạy” qua quá trình phóng điện - đèn LED sáng lên theo từng đợt.

    6 "Sóng chạy" từ đèn LED

    Các đèn LED lần lượt sáng lên và chúng ta quan sát thấy một “sóng” đèn đang chạy. Các đèn LED được điều khiển bằng thanh ghi thay đổi mà chúng tôi đã kết nối qua giao diện SPI. Kết quả là chỉ có 3 chân Arduino được sử dụng để điều khiển 8 đèn LED. Nếu chúng ta kết nối đèn LED trực tiếp với các cổng kỹ thuật số của Arduino, chúng ta sẽ cần sử dụng một cổng riêng cho mỗi đèn LED.

    Chúng tôi đã nghiên cứu ví dụ đơn giản nhất về Arduino làm việc với bus SPI. Chúng tôi sẽ xem xét chi tiết hơn hoạt động của một số thanh ghi thay đổi với các kết nối độc lập và xếp tầng trong một bài viết riêng.