Đẩy-kéo / mở cống; kéo lên / kéo xuống


49

Tôi đang đọc bảng dữ liệu của chip ARM Cortex, cụ thể là chương GPIO. Cuối cùng, tôi muốn định cấu hình các chân GPIO khác nhau để sử dụng chúng trong chế độ "Chức năng thay thế" để truy cập đọc / ghi vào SRAM.

Trong tất cả các thanh ghi GPIO có sẵn, tôi không hiểu hai: GPIO_PUPDRGPIO_OTYPEtương ứng là "thanh ghi kéo lên / kéo xuống" và "thanh ghi loại đầu ra".

GPIO_PUPDRtôi có ba lựa chọn:

  • Không kéo lên hoặc kéo xuống
  • Kéo lên
  • Dỡ xuống

GPIO_0TYPEtôi có hai lựa chọn:

  • Đầu ra đẩy
  • Đầu ra mở cống

Sự khác biệt giữa tất cả các cấu hình khác nhau và điều gì sẽ thích hợp nhất cho giao tiếp SRAM?

Tài liệu cho bảng tôi đang làm việc có sẵn ở đây (xem trang 24 để biết sơ đồ SRAM). Hướng dẫn tham khảo về Chip ARM có sẵn tại đây (xem trang 145 và 146 để biết các thanh ghi GPIO).


Bạn có thể cung cấp số mô hình / liên kết đến datasheets của CPU SRAM và ARM mà bạn sử dụng không.
Trưởng khoa

@Dean: Chắc chắn rồi. Tôi đã cập nhật câu hỏi của tôi với hai liên kết.
Randomblue

Câu trả lời:


54

Câu trả lời này là chung cho các bộ xử lý và thiết bị ngoại vi và có một nhận xét cụ thể về SRAM ở cuối, có lẽ phù hợp với RAM và CPU cụ thể của bạn.

Chân đầu ra có thể được điều khiển trong ba chế độ khác nhau:

  • mở cống - một bóng bán dẫn kết nối với mức thấp và không có gì khác
  • mở cống, với kéo lên - một bóng bán dẫn kết nối với mức thấp và một điện trở kết nối với mức cao
  • đẩy-kéo - một bóng bán dẫn kết nối với mức cao và một bóng bán dẫn kết nối với mức thấp (chỉ có một bóng bán dẫn được vận hành tại một thời điểm)

Các chân đầu vào có thể là một đầu vào cổng với:

  • kéo lên - một điện trở kết nối với cao
  • kéo xuống - một điện trở kết nối với mức thấp
  • kéo lên và kéo xuống - cả điện trở được kết nối với mức cao và điện trở được kết nối với mức thấp (chỉ hữu ích trong trường hợp hiếm).

Ngoài ra còn có một chế độ đầu vào được kích hoạt bởi Schmitt trong đó chân đầu vào được kéo với lực kéo yếu đến trạng thái ban đầu. Khi bị bỏ lại một mình, nó vẫn tồn tại trong trạng thái của nó, nhưng có thể được kéo sang một trạng thái mới với nỗ lực tối thiểu.

Cống mở rất hữu ích khi nhiều cổng hoặc chân được kết nối với nhau bằng cách kéo lên (bên ngoài hoặc bên trong). Nếu tất cả các chân đều cao, tất cả chúng đều là các mạch mở và kéo lên sẽ đẩy các chân lên cao. Nếu bất kỳ pin nào thấp, tất cả đều xuống thấp khi chúng liên kết với nhau. Cấu hình này có hiệu quả hình thành một ANDcổng.

Khi lái SRAM, bạn có thể muốn lái các dòng dữ liệu hoặc các dòng địa chỉ cao hoặc thấp một cách chắc chắn và nhanh nhất có thể để cần có ổ đĩa lên xuống chủ động, vì vậy chỉ cần kéo đẩy. Trong một số trường hợp có nhiều RAM, bạn có thể muốn làm một cái gì đó thông minh và kết hợp các dòng, trong đó chế độ khác có thể phù hợp hơn.

Với SRAM với dữ liệu đầu vào từ SRAM nếu IC RAM luôn luôn xác nhận dữ liệu thì một pin không có khả năng kéo lên có thể ổn vì RAM luôn đặt mức và điều này giảm thiểu tải. Nếu các dòng dữ liệu RAM đôi khi là mạch mở hoặc tristate, bạn sẽ cần các chân đầu vào để có thể đặt trạng thái hợp lệ của riêng chúng. Trong giao tiếp tốc độ rất cao, bạn có thể muốn sử dụng kéo lên và kéo xuống để điện trở hiệu dụng song song là điện trở kết thúc và điện áp không tải của bus được đặt bởi hai điện trở, nhưng điều này hơi chuyên nghiệp.


Nói rõ hơn, ý của bạn là "bóng bán dẫn kết nối với mức thấp và không có gì khác"? Một bóng bán dẫn có 3 chân. Làm thế nào là mỗi pin được kết nối?
Randomblue

@Randomblue - xin lỗi - bộ thu bóng bán dẫn hoặc thoát khi hoạt động như một đầu ra
Russell McMahon

Để làm rõ câu trả lời của bạn về "kéo xuống", sự khác biệt giữa "mặt đất", "thấp" và "-ve" là gì?
Randomblue

Tôi đã thực hiện rất nhiều chỉnh sửa cho câu hỏi của bạn, bạn có thể kiểm tra xem tôi có mắc lỗi gì không?
Randomblue

@Randomblue - Chỉnh sửa có vẻ tốt. Nó làm cho tôi tự hỏi những gì tôi đã viết ban đầu? Bạn dường như đã nói những gì tôi nghĩ tôi nghĩ :-).
Russell McMahon

17

Tôi đã tìm thấy câu trả lời này từ STM32 Hiểu về Cài đặt GPIO

  • GPIO_PuPd (Kéo lên / Kéo xuống)

Trong các mạch kỹ thuật số, điều quan trọng là các đường tín hiệu không bao giờ được phép "nổi". Đó là, họ cần phải luôn ở trạng thái cao hoặc trạng thái thấp. Khi nổi, trạng thái không xác định và gây ra một vài loại vấn đề khác nhau.

Cách để sửa lỗi này là thêm một điện trở từ đường tín hiệu vào Vcc hoặc Gnd. Theo cách đó, nếu đường dây không được tích cực điều khiển cao hay thấp, điện trở sẽ khiến điện thế bị trôi đến một mức đã biết.

ARM (và các bộ vi điều khiển khác) có mạch tích hợp để thực hiện việc này. Bằng cách đó, bạn không cần thêm một phần khác vào mạch của mình. Ví dụ: nếu bạn chọn "GPIO_PuPd_UP", thì việc thêm một điện trở giữa đường tín hiệu và Vcc là tương đương.

  • GPIO_OType (Loại đầu ra):

Đẩy-kéo: Đây là loại đầu ra mà hầu hết mọi người nghĩ là "tiêu chuẩn". Khi đầu ra xuống thấp, nó sẽ chủ động "kéo" xuống đất. Ngược lại, khi đầu ra được đặt ở mức cao, nó sẽ chủ động "đẩy" về phía Vcc. Đơn giản hóa, nó trông như thế này: nhập mô tả hình ảnh ở đây

Mặt khác, đầu ra Open-Drain chỉ hoạt động theo một hướng. Nó có thể kéo pin về phía mặt đất, nhưng nó không thể đẩy nó lên cao. Tưởng tượng hình ảnh trước đó, nhưng không có MOSFET phía trên. Khi nó không được kéo xuống đất, MOSFET (phía dưới) chỉ đơn giản là không dẫn điện, khiến đầu ra nổi.

Đối với loại đầu ra này, cần phải có một điện trở kéo lên được thêm vào mạch, điều này sẽ làm cho đường dây lên cao khi không được điều khiển thấp. Bạn có thể thực hiện việc này với một phần bên ngoài hoặc bằng cách đặt giá trị GPIO_PuPd thành GPIO_PuPd_UP.

Cái tên này xuất phát từ thực tế là cống của MOSFET không được kết nối nội bộ với bất cứ thứ gì. Loại đầu ra này còn được gọi là "collector mở" khi sử dụng BJT thay vì MOSFET.

  • GPIO_Speed

Về cơ bản, điều này kiểm soát tốc độ xoay (thời gian tăng và thời gian rơi) của tín hiệu đầu ra. Tốc độ quay càng nhanh, tiếng ồn phát ra từ mạch càng nhiều. Đó là một thực hành tốt để giữ tốc độ quay chậm, và chỉ tăng nó nếu bạn có một lý do cụ thể.


3

Thêm một chút nữa: đối với các bộ vi điều khiển không có chế độ "mở cống" rõ ràng, chẳng hạn như các bo mạch dựa trên AVR và Arduino ATmega328 như Uno, chế độ "mở cống" này có thể được mô phỏng bằng cách viết chức năng bao bọc chỉ đơn giản là đặt chân thành "Đầu ra THẤP" khi bạn gửi nó 0và cấu hình pin đó là "Ngõ vào THẤP" (chế độ trở kháng cao, điện trở pullup bên trong KHÔNG bật) khi bạn gửi nó 1. Bằng cách này bạn có được hiệu quả tương tự. Những bộ vi điều khiển ARM-core 32-bit hiện đại này chỉ có nhiều tùy chọn hơn là tất cả.

Ngoài ra, p146 của Tài liệu tham khảo STM32 được liên kết với các trạng thái trên [các bổ sung của tôi nằm trong dấu ngoặc vuông] :

- Chế độ thoát mở: Một 0 0 trong thanh ghi đầu ra kích hoạt N-MOS [từ đó chủ động lái THẤP bằng cách kết nối pin với GND] trong khi một 1 1 trong thanh ghi đầu ra rời khỏi cổng trong Hi-Z (P- MOS không bao giờ được kích hoạt) [chế độ trở kháng cao - giống như đầu vào nổi không có điện trở kéo lên hoặc kéo xuống]

- Chế độ kéo đẩy: Một 0 0 0 trong thanh ghi đầu ra kích hoạt N-MOS [chủ động điều khiển THẤP bằng cách kết nối pin với GND] trong khi một 1 1 trong thanh ghi đầu ra kích hoạt P-MOS [chủ động lái CAO bằng cách kết nối ghim vào VCC]


Trong mã Arduino, "hàm bao bọc" có thể được thực hiện như thế này:

digitalWriteOpenDrain(byte pin, bool state)
{
    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
    }
    // High impedance mode 
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
        digitalWrite(pin, LOW);
    }
}

Hoặc đơn giản hóa:

digitalWriteOpenDrain(byte pin, bool state)
{
    digitalWrite(pin, LOW);

    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
    }
    // High impedance mode
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
    }
}

Lưu ý rằng để bật điện trở pullup bên trong trên Arduino bạn có thể làm:

pinMode(pin, INPUT_PULLUP);

HOẶC (điều tương tự):

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);

Đọc thêm:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.