什么是有点敲打

电器工程 微控制器 avr C 编程
2022-01-26 12:36:30

我是微控制器编程的新手。我正在使用 ATmega32-A 控制器和 CodeVisionAVR 编译器。我正在使用波形发生器(AD9833)通过 SPI 通信生成正弦波信号。我能够成功生成正弦波。现在我将该信号传递给传感器。传感器输出通过多路复用器选择并发送到 ADC。现在我想使用 SPI 通信读取 ADC 值。我已经尝试了很多设置ADC的寄存器。仍然无法正常工作。要查看 SPI 通信代码,请查看我之前的帖子ADC registers setup using spi communication我正在使用 USART(RS232) 通信在 PC(PuTTY) 上打印值。

有人建议我使用 bit-banging。我对这个概念很陌生。任何人都可以为我提供一个 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;
}
2个回答

Bit banging 是在软件中创建整个系列的脉冲,而不是依赖于微控制器内部的一块硬件。

很多单片机都有硬件SPI,然后你只需要向输出寄存器写入一个字节,SPI控制器就会将数据移出,同时从从机接收数据。传输完成后可以得到一个中断,然后读取接收到的数据。

但是有些微控制器没有板载 SPI 硬件,然后您必须通过手动执行所有操作来模拟它。SPI 有多种不同的模式,我将以这个脉冲图为例:

在此处输入图像描述

因此,虽然专用的 SPI 控制器负责处理所有脉冲、数据移位和时序,但在进行 bit-banging 时,您必须自己采取每一个动作:

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 相对简单,例如 bit-banging I2C 的代码会更复杂,如果您想对 UART 协议进行 bit-bang,您将需要一个计时器。

Bit-banging 是指让输出或输入设备的信号由软件而不是硬件生成/采样的概念。显然需要一些硬件,但是当使用 bit-banging 时,每个输出的唯一硬件是一个可以由软件显式设置或清除的锁存器,每个输入的唯一硬件是一个接口,允许软件测试它是否是高或低(通常为一种状态而不是另一种状态执行条件分支)。

使用 bit-banging 可以达到的最大速度通常是使用专用硬件可以达到的速度的一小部分,但是在处理器速度施加的限制之外,bit-banging 更加通用,并且可以在某些情况下使用通用硬件不太合适,专用硬件不划算。

例如,许多控制器都有一个“SPI 风格”端口,其行为本质上如下:当一个字节被写入某个寄存器时,硬件将产生一定数量的时钟脉冲(通常为 8 个),输出一个数据位每个时钟脉冲的前沿和在后沿采样一个输入数据位。通常,控制器的 SPI 式端口将允许配置各种功能,但在某些情况下,可能需要将处理器与执行异常操作的设备连接起来。设备可能要求以除八位以外的倍数处理数据位,或者可能要求在同一时钟沿输出和采样数据,或者可能有其他一些不寻常的要求。如果一个正在使用的控制器上的特定硬件可以支持一个人的精确要求,很棒(有些提供可配置的位数,可单独配置的发送和接收定时等)如果没有,位碰撞可能会有所帮助。根据控制器的不同,对 SPI-ish 接口进行 bit-banging 所需的时间通常是让硬件处理它的时间的 2-10 倍,但如果要求与硬件不匹配,则更慢地交换数据可能比根本无法做到。

bit-banged 设计需要注意的一件重要事情是,在与之通信的设备正在等待 bit-banging 控制器生成所有时序或允许控制器在没有分心的情况下等待一个事件的到来,并且在它需要采取行动的任何其他事件到来之前,它将能够完成它需要对该事件做的所有事情。在设备需要能够在相对较短的时间范围内对外部刺激做出反应但又不能将其 100% 的能量用于观察此类刺激的情况下,它们的鲁棒性要低得多。

例如,假设希望让处理器以相对于其时钟速度非常高的速率串行传输 UART 类型的数据(例如,每秒运行 8,192 条指令的 PIC 希望以 1200 bps 的速度输出数据)。如果没有启用中断,则这种传输并不困难(每七个指令周期时钟一位)。如果 PIC 只等待传入的 1200bps 数据字节,它可以执行 3 个周期的循环等待起始位,然后以 7 个周期的间隔继续输入数据。实际上,如果 PIC 在传入的数据字节到达时准备好发送一个数据字节,那么每位 7 个周期就足以让 PIC 在读取传入字节的同时发送其数据字节。同样地,如果这样的回复相对于原始传输有固定的时间另一方面,速度如此之快的 PIC 将无法以这样一种方式处理 bit-bang 通信,即任何一个设备都可以在它认为合适的任何时候进行传输(而不是让一个设备在它看到的时候就可以传输)适合,并且在不传输时做任何它喜欢的事情,而一个设备将不得不花费大部分时间做任何事情,除了等待来自第一个设备的传输)。