การกัดบิตคืออะไร


26

ฉันใหม่สำหรับการเขียนโปรแกรมไมโครคอนโทรลเลอร์ ฉันใช้ ATmega32-A คอนโทรลเลอร์และคอมไพเลอร์ CodeVisionAVR ฉันใช้เครื่องกำเนิดสัญญาณ (AD9833) เพื่อสร้างสัญญาณคลื่นไซน์โดยใช้การสื่อสารแบบ SPI ฉันสามารถสร้างคลื่นไซน์ได้สำเร็จ ตอนนี้ฉันกำลังส่งสัญญาณนั้นไปยังเซ็นเซอร์ เอาต์พุตเซ็นเซอร์ถูกเลือกผ่านมัลติเพล็กเซอร์แล้วส่งไปยัง ADC ตอนนี้ฉันต้องการอ่านค่า ADC โดยใช้การสื่อสาร SPI ฉันพยายามอย่างมากในการตั้งค่าการลงทะเบียนของ ADC มันยังไม่ทำงาน หากต้องการดู SPI สื่อสารรหัสมีลักษณะที่ฉันโพสต์ก่อนหน้านี้ติดตั้ง ADC ลงทะเบียนใช้การสื่อสาร ฉันใช้การสื่อสาร USART (RS232) เพื่อพิมพ์ค่าบนพีซี (PuTTY)

มีบางคนแนะนำให้ฉันใช้การกัดบิต ฉันใหม่สำหรับแนวคิดนั้น ผู้ใดสามารถส่งรหัสตัวอย่างของการสื่อสารบิต SPI ให้ฉันได้ จะเริ่มขั้นตอนนั้นได้อย่างไร? ใครช่วยได้บ้างเป็นวัสดุที่ดี ฉันต้องการฮาร์ดแวร์ภายนอกหรือไม่

ฉันได้เขียนสิ่งนี้รวมถึงการเชื่อมต่อพิน:

#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;
}


รหัสของคุณดูโอเคนอกเหนือจากสัญญาณนาฬิกาต่ำควรอยู่ก่อนการตั้งค่าบิตและการหน่วงเวลา คุณต้องล่าช้าสองสามครั้งในการแก้ไขเวลา (ดังนั้นนาฬิกาต่ำ / สูงนั้นเป็นช่วงเวลาเดียวกัน) ลองดูโค้ดของสตีเว่นอีกครั้ง หากคุณต้องการอ่านเช่นกันคุณจะต้องเพิ่มรหัสสำหรับสิ่งนั้นด้วย
Oli Glaser

@OliGlaser ฉันสามารถใช้รหัสนี้โดยตรงแทนรหัส SPI ปกติที่จะตั้งค่าการลงทะเบียน
verendra

@verendra - ไม่แน่ใจว่าคุณหมายถึงอะไรโดย "รหัส SPI ปกติ" หากคุณหมายถึงแทนที่จะเป็นฮาร์ดแวร์ SPI ดังนั้น ADC จะไม่สนใจว่าพัลส์จะถูกสร้างขึ้นมานานแค่ไหนเมื่อพวกเขาเห็นด้วยกับโปรโตคอลและเวลา
Oli Glaser

คำตอบ:


25

การทุบตีบิตเป็นการสร้างพัลส์ทั้งชุดในซอฟต์แวร์แทนที่จะอาศัยฮาร์ดแวร์ชิ้นหนึ่งในไมโครคอนโทรลเลอร์

ไมโครคอนโทรลเลอร์หลายตัวมีฮาร์ดแวร์ SPI และสิ่งที่คุณต้องทำคือเขียนไบต์ไปยังเอาต์พุตรีจิสเตอร์และคอนโทรลเลอร์ SPI จะเลื่อนข้อมูลออกและในเวลาเดียวกันก็รับข้อมูลจากสลาฟ คุณสามารถรับการขัดจังหวะเมื่อการถ่ายโอนเสร็จสมบูรณ์แล้วอ่านข้อมูลที่ได้รับ

แต่ไมโครคอนโทรลเลอร์บางตัวไม่มีฮาร์ดแวร์ SPI บนเครื่องแล้วคุณต้องจำลองด้วยการทำทุกอย่างด้วยตนเอง SPI มีหลายโหมดที่แตกต่างกันฉันจะใช้พัลส์แผนภาพนี้เป็นตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นในขณะที่คอนโทรลเลอร์ SPI เฉพาะจะดูแลพัลส์ทั้งหมดการเปลี่ยนข้อมูลและกำหนดเวลาเมื่อการกระแทกบิตคุณต้องดำเนินการทุกอย่างด้วยตัวเอง:

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  

Bit-banging SPI นั้นค่อนข้างง่ายโค้ดสำหรับ I-Banging เช่นนั้นจะมีความซับซ้อนมากขึ้นและคุณจะต้องใช้ตัวจับเวลาถ้าคุณต้องการบิตของโปรโตคอล UART


2
คุณสามารถให้ตัวอย่างรหัส c
verendra

1
@verendra - ฉันได้เพิ่มตัวอย่าง pseudocode ซึ่งคุณสามารถแปลเป็น C ได้อย่างง่ายดาย
stevenvh

ฉันกำลังสร้าง Wavefrom ให้สำเร็จโดยใช้การสื่อสาร SPI ฉันมีปัญหาในการอ่านค่า ADC โดยใช้ SPI เท่านั้น ฉันต้องใช้การชนบิตสำหรับทั้งสองหรือเพียงแค่อ่านค่า ADC คุณช่วยดูรหัสของฉันเพื่อส่ง 8 บิตได้ไหม แต่ฉันสับสนว่าจะใช้มันอย่างไร ฉันสามารถวางรหัสนี้โดยตรงแทนที่จะเป็นรหัส SPI เพื่อตั้งค่าการลงทะเบียน
verendra

@Steven - แผนภาพที่คุณแสดงคือ MSB ก่อนดังนั้นคุณต้องเลื่อนออกจาก 7 และเลื่อนซ้ายจาก 0 ฉันรู้ว่าไม่มีมาตรฐานดังนั้นมันจึงเป็น LSB ได้ก่อน แต่ฉันคิดว่าอุปกรณ์ต่อพ่วง SPI ส่วนใหญ่ทำแบบนี้ .
Oli Glaser

2
@Oli - จุดดีฉันพลาด ฉันจะแก้ไขมันขอบคุณสำหรับความคิดเห็น เหตุผลที่ไม่มีมาตรฐานคือไม่สำคัญว่าจำนวนบิตที่โอนจะเท่ากับความยาว shift shift เมื่อเร็ว ๆ นี้ไมโครคอนโทรลเลอร์บางตัว (เช่น NXP Cortec-M3) มีการเปลี่ยนแปลงความยาวของการลงทะเบียนแล้วทิศทางอาจมีความสำคัญ IIRC ใน AVR คุณสามารถเลือก MSB ก่อนหรือ LSB ก่อน
stevenvh

6

Bit-banging หมายถึงแนวคิดของการมีสัญญาณที่ออกไปหรือเข้าสู่อุปกรณ์ที่ถูกสร้าง / สุ่มตัวอย่างโดยซอฟต์แวร์มากกว่าฮาร์ดแวร์ เห็นได้ชัดว่าจำเป็นต้องใช้ฮาร์ดแวร์บางตัว แต่เมื่อใช้การกระแทกบิตฮาร์ดแวร์เพียงตัวเดียวสำหรับแต่ละเอาต์พุตคือสลักที่สามารถกำหนดหรือล้างได้อย่างชัดเจนโดยซอฟต์แวร์และฮาร์ดแวร์เฉพาะสำหรับอินพุตแต่ละตัวคืออินเทอร์เฟซเพื่อให้ซอฟต์แวร์ทดสอบว่าเป็นหรือไม่ สูงหรือต่ำ (และโดยทั่วไปแล้วจะดำเนินการสาขาที่มีเงื่อนไขสำหรับหนึ่งรัฐ แต่ไม่ใช่สาขาอื่น)

ความเร็วสูงสุดที่สามารถทำได้ด้วยการกัดบิตโดยทั่วไปจะเป็นเพียงเสี้ยวหนึ่งของสิ่งที่สามารถทำได้ด้วยฮาร์ดแวร์ที่สร้างขึ้นตามวัตถุประสงค์ แต่นอกเหนือจากข้อ จำกัด ที่กำหนดโดยความเร็วของโปรเซสเซอร์การกัดบิตนั้นมีความหลากหลายมากกว่าและอาจใช้ในสถานการณ์ ในกรณีที่ฮาร์ดแวร์ที่ใช้งานทั่วไปไม่เหมาะสมและฮาร์ดแวร์ที่มีวัตถุประสงค์พิเศษจะไม่คุ้มค่า

ตัวอย่างเช่นตัวควบคุมหลายตัวมีพอร์ต "SPI-style" ซึ่งทำงานเป็นหลักดังต่อไปนี้: เมื่อไบต์ถูกเขียนไปยังรีจิสเตอร์ที่แน่นอนฮาร์ดแวร์จะสร้างพัลส์สัญญาณนาฬิกาจำนวนหนึ่ง ขอบนำของพัลส์นาฬิกาแต่ละครั้งและสุ่มบิตข้อมูลขาเข้าบนขอบต่อท้าย โดยทั่วไปแล้วพอร์ตสไตล์ SPI ของคอนโทรลเลอร์จะช่วยให้สามารถกำหนดค่าคุณสมบัติได้หลากหลาย แต่ในบางกรณีอาจจำเป็นต้องเชื่อมต่อโปรเซสเซอร์กับอุปกรณ์ซึ่งทำสิ่งผิดปกติ อุปกรณ์อาจต้องการให้บิตข้อมูลประมวลผลเป็นทวีคูณนอกเหนือจากแปดหรืออาจต้องการข้อมูลนั้นทั้งเอาต์พุตและตัวอย่างบนขอบนาฬิกาเดียวกันหรืออาจมีข้อกำหนดอื่นที่ผิดปกติ หากฮาร์ดแวร์ตัวใดตัวหนึ่งในคอนโทรลเลอร์ใช้รองรับความต้องการที่แม่นยำ ดีมาก (บางแห่งมีจำนวนบิตที่กำหนดค่าได้การส่งและรับเวลาที่กำหนดแยกต่างหาก ฯลฯ ) หากไม่การใช้บิตการชนอาจมีประโยชน์ ขึ้นอยู่กับตัวควบคุมบิตกระแทกอินเทอร์เฟซ SPI-ish มักจะใช้เวลา 2-10 ครั้งตราบเท่าที่ปล่อยให้ฮาร์ดแวร์จัดการกับมัน แต่ถ้าข้อกำหนดไม่พอดีกับฮาร์ดแวร์ที่มีการแลกเปลี่ยนข้อมูลช้ากว่าอาจจะดีกว่า ไม่สามารถทำได้เลย

สิ่งหนึ่งที่สำคัญที่ต้องทราบด้วยการออกแบบบิตกระแทกคือมันเป็นสิ่งที่ง่ายที่สุดและแข็งแกร่งที่สุดในสถานการณ์ที่อุปกรณ์สื่อสารได้รับการรอคอยอยู่บนตัวควบคุมบิตกระแทกเพื่อสร้างเวลาของพวกเขาหรือที่ตัวควบคุมจะได้รับอนุญาต รอโดยไม่มีการรบกวนสำหรับเหตุการณ์ที่จะมาถึงและที่ที่จะสามารถทำทุกอย่างที่จำเป็นต้องทำกับเหตุการณ์นั้นก่อนที่กิจกรรมอื่น ๆ มาถึงที่จำเป็นต้องดำเนินการ อุปกรณ์เหล่านี้มีความแข็งแกร่งน้อยกว่ามากในสถานการณ์ที่อุปกรณ์จะต้องสามารถตอบสนองต่อสิ่งเร้าภายนอกภายในระยะเวลาอันสั้น แต่ไม่สามารถใช้อุปกรณ์ 100% ของพลังงานในการรับชมสิ่งเร้าดังกล่าว

ตัวอย่างเช่นสมมติว่าหนึ่งต้องการให้ตัวประมวลผลส่งข้อมูลสไตล์ UART ในอัตราที่สูงมากเมื่อเทียบกับความเร็วสัญญาณนาฬิกาของมัน (เช่น PIC ซึ่งกำลังรัน 8,192 คำสั่งต่อวินาทีที่ต้องการส่งออกข้อมูลที่ 1200 bps) หากไม่มีการขัดจังหวะการเปิดใช้งานการส่งสัญญาณดังกล่าวก็ไม่ยาก (นาฬิกาหนึ่งบิตทุก ๆ เจ็ดรอบคำสั่ง) หาก PIC ไม่ทำอะไรเลยนอกจากกำลังรอข้อมูลไบต์ 1200bps ที่เข้ามาก็สามารถดำเนินการวนรอบ 3 รอบเพื่อรอบิตเริ่มต้นจากนั้นดำเนินการนาฬิกาในข้อมูลในช่วงเวลาเจ็ดรอบ แน่นอนถ้า PIC มีไบต์ของข้อมูลพร้อมที่จะส่งเมื่อไบต์ขาเข้าของข้อมูลมาถึงเจ็ดรอบต่อบิตจะมีเวลาเพียงพอสำหรับ PIC ที่จะส่งไบต์ของข้อมูลพร้อมกันกับการอ่านไบต์ขาเข้า ในทำนองเดียวกันถ้าตอบกลับดังกล่าวจะมีการแก้ไขระยะเวลาที่สัมพันธ์กับการส่งต้นฉบับ ในทางตรงกันข้ามจะไม่มีทางที่ PICs จะจัดการความเร็วในการสื่อสารบิต - บอมในลักษณะที่อุปกรณ์ทั้งสองได้รับอนุญาตให้ส่งสัญญาณได้ตลอดเวลาที่เห็นสมควร (เมื่อเทียบกับการมีอุปกรณ์หนึ่งที่สามารถส่งสัญญาณเมื่อเห็น พอดีและทำสิ่งที่มันชอบเมื่อไม่ส่งสัญญาณและอุปกรณ์หนึ่งซึ่งจะต้องใช้เวลาส่วนใหญ่ในการทำอะไร แต่รอการส่งสัญญาณจากอุปกรณ์แรก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.