- Bit Banging là gì?
- Khi nào sử dụng Bit Banging
- Thuật toán giao tiếp nối tiếp qua bit Banging
- Bit Banging trên SPI
- Ví dụ về Bit Banging: Giao tiếp SPI trong Arduino
- Nhược điểm của Bit Banging
- UART qua Bit đập trong Arduino
Giao diện Giao diện là một trong những yếu tố được xem xét khi lựa chọn một bộ vi điều khiển được sử dụng cho một dự án. Nhà thiết kế đảm bảo rằng bộ vi điều khiển đang được chọn có tất cả các giao diện cần thiết để giao tiếp với tất cả các thành phần khác được sử dụng cho sản phẩm. Sự tồn tại của một số giao diện này như SPI và I2C trên vi điều khiển luôn làm tăng chi phí của các vi điều khiển đó và tùy thuộc vào ngân sách BOM, nó có thể làm cho một vi điều khiển mong muốn không hợp túi tiền. Trong những tình huống như thế này, các kỹ thuật như Bit Banging phát huy tác dụng.
Bit Banging là gì?
Bit banging là một kỹ thuật giao tiếp nối tiếp trong đó toàn bộ quá trình giao tiếp được xử lý thông qua phần mềm thay vì phần cứng chuyên dụng. Để truyền dữ liệu, kỹ thuật này liên quan đến việc sử dụng phần mềm để mã hóa dữ liệu thành các tín hiệu và xung được sử dụng để điều khiển trạng thái của chân I / O của vi điều khiển, đóng vai trò là chân Tx để gửi dữ liệu đến thiết bị đích. Để nhận dữ liệu, kỹ thuật này liên quan đến việc lấy mẫu trạng thái của chân Rx sau những khoảng thời gian nhất định được xác định bởi tốc độ truyền thông tin liên lạc. Phần mềm đặt tất cả các tham số cần thiết để đạt được giao tiếp này bao gồm đồng bộ hóa, thời gian, mức độ, v.v., thường được quyết định bởi phần cứng chuyên dụng khi không sử dụng bit banging.
Khi nào sử dụng Bit Banging
Bit-Banging thường được sử dụng trong các trường hợp không có sẵn bộ vi điều khiển với giao diện yêu cầu hoặc khi chuyển sang bộ vi điều khiển có giao diện yêu cầu có thể quá đắt. Do đó, nó cung cấp một cách rẻ để cho phép cùng một thiết bị giao tiếp bằng cách sử dụng một số giao thức. Một bộ vi điều khiển trước đây chỉ được bật cho giao tiếp UART, có thể được trang bị để giao tiếp bằng SPI và 12C thông qua bit banging.
Thuật toán giao tiếp nối tiếp qua bit Banging
Mặc dù mã để triển khai bit banging có thể khác nhau trên các bộ vi điều khiển khác nhau và cũng có thể khác nhau đối với các giao thức nối tiếp khác nhau, nhưng quy trình / thuật toán để thực hiện bit banging là giống nhau trên tất cả các nền tảng.
Để gửi dữ liệu, ví dụ như mã giả bên dưới được sử dụng;
- Khởi đầu
- Gửi bit bắt đầu
- Chờ thời gian tương ứng với tốc độ truyền của máy thu
- Gửi dữ liệu bit
- Chờ khoảng thời gian tương ứng với tốc độ truyền của máy thu một lần nữa
- Kiểm tra xem tất cả các bit dữ liệu đã được gửi đi chưa. Nếu không, chuyển đến 4. Nếu có, chuyển đến 7
- Gửi bit dừng
- Dừng lại
Việc nhận dữ liệu có xu hướng phức tạp hơn một chút, thông thường một ngắt được sử dụng để xác định thời điểm có dữ liệu trên chân nhận. Điều này giúp đảm bảo vi điều khiển không tốn quá nhiều sức mạnh xử lý. Mặc dù một số triển khai nhất định sử dụng bất kỳ chân I / O nào của bộ vi điều khiển nhưng khả năng nhiễu và lỗi, nếu không được xử lý, sẽ cao hơn. Thuật toán nhận dữ liệu sử dụng ngắt được giải thích dưới đây.
- Khởi đầu
- Bật ngắt trên chân Rx
- Khi ngắt được kích hoạt, lấy bit bắt đầu
- Chờ thời gian theo tốc độ truyền
- Đọc chân Rx
- Lặp lại từ 4 cho đến khi nhận được tất cả dữ liệu
- Chờ thời gian theo tốc độ truyền
- Kiểm tra bit dừng
- Dừng lại
Bit Banging trên SPI
Như đã đề cập ở trên, bit banging đối với các giao thức khác nhau hoạt động khác nhau và do đó, điều quan trọng là phải đọc về từng giao thức, để hiểu khung dữ liệu và xung nhịp trước khi cố gắng thực hiện. Lấy chế độ SPI 1 làm ví dụ, giá trị cơ bản của đồng hồ luôn là 0 và dữ liệu luôn được gửi hoặc nhận trên cạnh lên của đồng hồ. Biểu đồ thời gian cho giao thức truyền thông SPI Mode 1 được hiển thị bên dưới.
Để thực hiện điều này, có thể sử dụng thuật toán sau;
- Khởi đầu
- Đặt chân SS ở mức thấp để bắt đầu giao tiếp
- Đặt chân cho Master Out Slave In (MOSI) thành bit đầu tiên của dữ liệu được gửi
- Đặt chân đồng hồ (SCK) cao để dữ liệu được truyền bởi chủ và nhận bởi phụ
- Đọc trạng thái của Master trong Slave Out (MISO) để nhận bit dữ liệu đầu tiên từ slave
- Đặt SCK Thấp để dữ liệu có thể được gửi trên cạnh tăng tiếp theo
- Chuyển đến 2 cho đến khi tất cả các bit dữ liệu đã được truyền.
- Đặt chân SS Cao để dừng truyền.
- Dừng lại
Ví dụ về Bit Banging: Giao tiếp SPI trong Arduino
Ví dụ: chúng ta hãy triển khai thuật toán giao tiếp SPI thông qua bit banging trong Arduino để cho thấy cách dữ liệu có thể được bit- banging qua SPI bằng cách sử dụng mã bên dưới.
Chúng tôi bắt đầu bằng cách khai báo các chân của Arduino sẽ được sử dụng.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Giá trị được gửi byte slaveData = 0; // để lưu trữ giá trị do nô lệ gửi
Tiếp theo, chúng ta chuyển đến hàm void setup () nơi khai báo trạng thái của các chân. Chỉ chân Master in Slave out (MISO) được khai báo là đầu vào vì nó là chân duy nhất nhận dữ liệu. Tất cả các chân khác được khai báo là đầu ra. Sau khi khai báo các chế độ chân, chân SS được đặt thành CAO. Lý do cho điều này là để đảm bảo quá trình không có lỗi và giao tiếp chỉ bắt đầu khi nó được đặt ở mức thấp.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Tiếp theo, chúng tôi bắt đầu vòng lặp để gửi dữ liệu. Lưu ý rằng vòng lặp này sẽ tiếp tục gửi dữ liệu nhiều lần.
Chúng tôi bắt đầu vòng lặp bằng cách ghi chân SS xuống thấp, để bắt đầu bắt đầu giao tiếp và gọi hàm bitbangdata để chia dữ liệu được xác định trước thành các bit và gửi đi. Sau đó, chúng tôi ghi chân SS HIGH để cho biết kết thúc quá trình truyền dữ liệu.
void loop () { digitalWrite (SSPin, LOW); // SS low slaveData = bitBangData (sendData); // truyền dữ liệu digitalWrite (SSPin, HIGH); // SS lại cao }
Các bitbangdata () chức năng được viết bên dưới. Hàm nhận dữ liệu được gửi và chia nhỏ dữ liệu thành các bit và gửi đi bằng cách lặp lại mã để truyền như được chỉ ra trong bước 7 của thuật toán.
byte bitBangData (byte _send) // Hàm này truyền dữ liệu qua bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bit trong một byte { digitalWrite (MOSIPin, bitRead (_send, i)); // Đặt MOSI digitalWrite (SCKPin, HIGH); // SCK bitWrite cao (_receive, i, digitalRead (MISOPin)); // Chụp MISO digitalWrite (SCKPin, LOW); // SCK thấp } return _receive; // Trả về dữ liệu đã nhận }
Nhược điểm của Bit Banging
Tuy nhiên, việc áp dụng bit banging nên là một quyết định được cân nhắc kỹ lưỡng vì có một số nhược điểm của bit banging có thể khiến nó không đáng tin cậy để thực hiện trong một số giải pháp nhất định. Bit đập làm tăng điện năng tiêu thụ của vi điều khiển do công suất xử lý tiêu thụ cao của quá trình. So với phần cứng chuyên dụng, nhiều lỗi giao tiếp như trục trặc và chập chờn xảy ra khi sử dụng bit banging, đặc biệt khi giao tiếp dữ liệu được thực hiện bởi bộ vi điều khiển cùng lúc với các tác vụ khác. Giao tiếp qua bit đập xảy ra ở một phần nhỏ tốc độ xảy ra khi sử dụng phần cứng chuyên dụng. Điều này có thể quan trọng trong một số ứng dụng nhất định và có thể khiến một lựa chọn “không tốt cho lắm”.
Bit đập được sử dụng cho tất cả các loại truyền thông nối tiếp bao gồm; RS-232, Giao tiếp nối tiếp không đồng bộ, UART, SPI và I2C.
UART qua Bit đập trong Arduino
Một trong những cách triển khai phổ biến của bit banging là thư viện Nối tiếp phần mềm Arduino cho phép Arduino giao tiếp qua UART mà không cần sử dụng chân UART phần cứng chuyên dụng (D0 và D1). Điều này mang lại rất nhiều sự linh hoạt vì người dùng có thể kết nối nhiều thiết bị nối tiếp với số lượng chân cắm trên bảng Arduino có thể hỗ trợ.