Bit đập là gì


26

Tôi mới làm quen với lập trình vi điều khiển. Tôi đang sử dụng bộ điều khiển ATmega32-A và trình biên dịch CodeVisionAVR. Tôi đang sử dụng bộ tạo dạng sóng (AD9833) để tạo tín hiệu hình sin bằng giao tiếp SPI. Tôi có thể tạo ra sin thành công. Bây giờ tôi đang truyền tín hiệu đó đến cảm biến. Đầu ra cảm biến được chọn thông qua bộ ghép kênh và gửi đến ADC. Bây giờ tôi muốn đọc các giá trị ADC bằng giao tiếp SPI. Tôi đã cố gắng rất nhiều để thiết lập các thanh ghi của ADC. Tuy nhiên, nó không hoạt động. Để xem Mã giao tiếp SPI, hãy xem thiết lập đăng ký ADC trước đây của tôi bằng cách sử dụng giao tiếp spi . Tôi đang sử dụng giao tiếp USART (RS232) để in các giá trị trên PC (PuTTY).

Có người khuyên tôi nên sử dụng bit-banging. Tôi mới biết đến khái niệm đó. Bất kỳ ai có thể cung cấp cho tôi một mã ví dụ về việc đập bit của truyền thông SPI. Làm thế nào để bắt đầu thủ tục đó? Bất cứ ai có thể cung cấp cho tôi một tài sản tốt. Tôi có cần bất kỳ phần cứng bên ngoài?

Tôi đã viết điều này, bao gồm các kết nối pin:

#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7

void send_8bit_serial_data(unsigned char data)
{
    int i;  
    ADC_CS=0;
    for (i = 0; i < 8; i++)
    {
        // consider leftmost bit
        // set line high if bit is 1, low if bit is 0
        if (data & 0x80)
            output_high(PORTB.5);
        else
            output_low(PORTB.5);

        // pulse clock to indicate that bit value should be read
        output_low(PORTB.7);
        output_high(PORTB.7);

        // shift byte left so next bit will be leftmost
        data <<= 1;
    }

    // deselect device
    ADC_CS=1;
}


Mã của bạn trông ổn ngoài đầu ra xung nhịp thấp nên trước khi cài đặt bit và độ trễ. Bạn cần một vài độ trễ để sửa thời gian (vì vậy đồng hồ thấp / cao gần bằng cùng một khoảng thời gian) Hãy xem lại mã của Steven. Nếu bạn muốn đọc tốt, bạn cũng sẽ cần phải thêm mã cho điều đó.
Oli Glaser

@OliGlaser Tôi có thể sử dụng trực tiếp mã này thay vì Mã SPI thông thường để thiết lập các thanh ghi.
verendra

@verendra - không chắc ý của bạn là "mã SPI bình thường". Nếu bạn có nghĩa là thay vì SPI phần cứng, thì ADC không quan tâm làm thế nào các xung được tạo ra miễn là chúng đồng ý với giao thức và thời gian.
Oli Glaser

Câu trả lời:


25

Bit banging đang tạo ra một loạt các xung trong phần mềm, thay vì dựa vào một phần cứng bên trong vi điều khiển.

Nhiều bộ vi điều khiển có SPI phần cứng, và sau đó tất cả những gì bạn phải làm là ghi một byte vào thanh ghi đầu ra và bộ điều khiển SPI sẽ chuyển dữ liệu ra ngoài, đồng thời nhận dữ liệu từ Slave. Bạn có thể nhận được một ngắt khi quá trình chuyển hoàn tất, sau đó đọc dữ liệu nhận được.

Nhưng một số bộ vi điều khiển không có phần cứng SPI trên tàu và sau đó bạn phải mô phỏng nó bằng cách làm mọi thứ thủ công. SPI có một số chế độ khác nhau, tôi sẽ sử dụng sơ đồ xung này làm ví dụ:

nhập mô tả hình ảnh ở đây

Vì vậy, trong khi bộ điều khiển SPI chuyên dụng đảm nhiệm tất cả các xung, dịch chuyển dữ liệu và thời gian, khi đập, bạn phải tự mình thực hiện mọi hành động:

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

SPI banging tương đối đơn giản, ví dụ mã I2C đập bit sẽ phức tạp hơn và bạn sẽ cần một bộ đếm thời gian bằng cách nào đó nếu bạn muốn bit-bang giao thức UART.


2
Bạn có thể cung cấp một mã c mẫu.
verendra

1
@verendra - Tôi đã thêm một ví dụ mã giả, mà bạn sẽ có thể dịch dễ dàng sang C.
stevenvh

Tôi thành công tạo Wavefrom bằng giao tiếp SPI. Tôi gặp vấn đề với việc đọc các giá trị ADC chỉ bằng SPI. Tôi phải sử dụng bit banging cho cả hai hoặc chỉ để đọc các giá trị ADC. Bạn có thể xem mã của tôi để gửi 8 bit không, nó có viết không. nhưng tôi bối rối làm thế nào để sử dụng nó. Tôi có thể đặt mã này trực tiếp thay vì mã SPI của tôi để thiết lập đăng ký.
verendra

@Steven - sơ đồ bạn hiển thị là MSB trước tiên, vì vậy bạn cần chuyển sang trái từ 7 và dịch chuyển trái từ 0. Tôi biết không có tiêu chuẩn nào nên có thể là LSB trước, nhưng tôi nghĩ hầu hết các thiết bị ngoại vi SPI đều làm theo cách này .
Oli Glaser

2
@Oli - điểm tốt, tôi đã bỏ lỡ điều đó. Tôi sẽ sửa nó, cảm ơn vì đã phản hồi. Lý do không có tiêu chuẩn là vì nó không quan trọng miễn là số lượng bit được truyền bằng với độ dài thanh ghi thay đổi. Gần đây, một số bộ vi điều khiển (như NXP Cortec-M3) có thanh ghi thay đổi độ dài thay đổi, và sau đó hướng có thể quan trọng. IIRC trong AVR bạn có thể chọn MSB trước hoặc LSB trước.
stevenvh

6

Bit-banging đề cập đến khái niệm có các tín hiệu đi ra hoặc đi vào thiết bị được tạo / lấy mẫu bằng phần mềm thay vì phần cứng. Rõ ràng một số phần cứng là bắt buộc, nhưng khi sử dụng bit-banging, phần cứng duy nhất cho mỗi đầu ra là một chốt có thể được cài đặt hoặc xóa rõ ràng bằng phần mềm và phần cứng duy nhất cho mỗi đầu vào là giao diện để cho phép phần mềm kiểm tra xem nó có phải là cao hoặc thấp (và thường thực hiện một nhánh có điều kiện cho một trạng thái nhưng không phải là trạng thái khác).

Tốc độ tối đa có thể đạt được khi đập bit nói chung sẽ là một phần của những gì có thể đạt được với phần cứng được xây dựng có mục đích, nhưng bên ngoài các giới hạn được áp đặt bởi tốc độ của bộ xử lý, thì đập bit linh hoạt hơn nhiều và có thể được sử dụng trong các trường hợp trong đó phần cứng đa năng không hoàn toàn phù hợp và phần cứng có mục đích đặc biệt sẽ không hiệu quả về mặt chi phí.

Ví dụ, nhiều bộ điều khiển có cổng "kiểu SPI" hoạt động cơ bản như sau: khi một byte được ghi vào một thanh ghi nhất định, phần cứng sẽ tạo ra một số xung đồng hồ (thường là tám), tạo ra một bit dữ liệu trên cạnh đầu của mỗi xung đồng hồ và lấy mẫu bit dữ liệu đến trên cạnh kế tiếp. Nói chung, các cổng kiểu SPI của bộ điều khiển sẽ cho phép cấu hình nhiều tính năng khác nhau, nhưng trong một số trường hợp, có thể cần phải giao tiếp bộ xử lý với một thiết bị có gì đó bất thường. Một thiết bị có thể yêu cầu các bit dữ liệu được xử lý theo bội số khác với tám hoặc có thể yêu cầu dữ liệu đó là cả đầu ra và được lấy mẫu trên cùng một cạnh đồng hồ hoặc có thể có một số yêu cầu bất thường khác. Nếu phần cứng cụ thể trên bộ điều khiển mà người dùng đang sử dụng có thể hỗ trợ các yêu cầu chính xác của một người, tuyệt vời (một số cung cấp số bit có thể định cấu hình, thời gian truyền và nhận cấu hình riêng biệt, v.v.) Nếu không, đập bit có thể hữu ích. Tùy thuộc vào bộ điều khiển, việc đập bit giao diện SPI-ish thường sẽ mất gấp 2-10 lần miễn là để phần cứng xử lý nó, nhưng nếu các yêu cầu không phù hợp với phần cứng có, việc trao đổi dữ liệu chậm hơn có thể tốt hơn không thể làm điều đó

Một điều quan trọng cần lưu ý với các thiết kế đập bit là chúng đơn giản và mạnh mẽ nhất trong trường hợp các thiết bị được giao tiếp đang chờ trên bộ điều khiển đập để tạo ra tất cả thời gian của chúng, hoặc nơi bộ điều khiển sẽ được phép chờ đợi, không mất tập trung, để một sự kiện đến và nơi nó sẽ có thể làm mọi thứ cần làm với sự kiện đó trước khi bất kỳ sự kiện nào khác đến mà nó cần phải hành động. Chúng kém mạnh mẽ hơn trong trường hợp một thiết bị sẽ cần có khả năng phản ứng với các kích thích bên ngoài trong khung thời gian tương đối ngắn, nhưng không thể thiết bị 100% năng lượng để theo dõi các kích thích đó.

Ví dụ: giả sử một người muốn có bộ xử lý truyền dữ liệu theo kiểu UART theo tốc độ rất cao so với tốc độ xung nhịp của nó (ví dụ PIC đang chạy 8.192 lệnh mỗi giây để xuất dữ liệu ở tốc độ 1200 bps). Nếu không có ngắt được kích hoạt, việc truyền như vậy không khó (đồng hồ một bit cứ sau bảy chu kỳ lệnh). Nếu một PIC không làm gì ngoài việc chờ một byte dữ liệu 1200bps đến, nó có thể thực thi một vòng lặp 3 chu kỳ chờ bit bắt đầu, sau đó tiến hành đồng hồ dữ liệu theo các chu kỳ bảy chu kỳ. Thật vậy, nếu PIC có một byte dữ liệu sẵn sàng để gửi khi một byte dữ liệu đến, bảy chu kỳ trên mỗi bit sẽ đủ thời gian để PIC gửi byte dữ liệu của nó đồng thời với việc đọc byte đến. Tương tự như vậy,nếu trả lời như vậy sẽ có thời gian cố định liên quan đến truyền ban đầu . Mặt khác, PIC sẽ không có cách nào để tăng tốc độ xử lý các liên lạc bit-bang theo cách mà một thiết bị được phép truyền bất cứ lúc nào nó thấy phù hợp (trái ngược với việc có một thiết bị có thể truyền khi nhìn thấy phù hợp và làm bất cứ điều gì nó thích khi không truyền và một thiết bị sẽ phải dành phần lớn thời gian để không làm gì ngoài việc chờ truyền từ thiết bị đầu tiên).

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.