什么有点撞


26

我是微控制器编程的新手。我正在使用ATmega32-A控制器和CodeVisionAVR编译器。我正在使用波形发生器(AD9833)通过SPI通信生成正弦波信号。我能够成功生成正弦波。现在,我将该信号传递给传感器。传感器输出通过多路复用器选择,并发送到ADC。现在,我想使用SPI通信读取ADC值。我已经尝试了很多设置ADC的寄存器。仍然无法正常工作。要查看SPI通信,请看我以前发布的使用spi通信的ADC寄存器设置。我正在使用USART(RS232)通信在PC(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;
}


您的代码看起来不错,除了时钟输出低电平应该在位设置和延迟之前。您需要几个延迟来固定时序(因此时钟的低/高大致处于相同的周期),再次查看Steven的代码。如果您也想阅读,则也需要添加代码。
奥利·格拉泽

@OliGlaser我可以直接使用此代码代替用于设置寄存器的普通SPI代码吗?
verendra 2012年

@verendra-不确定“普通SPI代码”的含义。如果您的意思不是硬件SPI,则ADC不在乎脉冲如何生成,只要它们与协议和时序一致即可。
奥利·格拉泽

Answers:


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  

位撞击SPI比较简单,例如,位撞击I2C的代码将更复杂,如果要对UART协议进行位撞击,则需要某种方式的计时器。


2
您能否提供示例C代码。
verendra 2012年

1
@verendra -我加了伪代码示例,你应该能够很容易地转化为C.
stevenvh

我使用SPI通信成功生成了Wave。我仅使用SPI读取ADC值时遇到问题。我必须对两者都使用位冲击或仅读取ADC值。你能看看我的代码发送8位,是写的吗。但我混淆了如何使用它。我可以直接将此代码而不是我的SPI代码放置到设置寄存器中吗?
verendra 2012年

@Steven-您显示的图是MSB在先,因此您需要从7左移,从0左移。我知道没有标准,因此可以是LSB在先,但是我认为大多数SPI外设都是这样做的。
奥利·格拉泽

2
@Oli-好点,我错过了。我会解决的,感谢您的反馈。没有标准的原因是,只要传输的位数等于移位寄存器的长度就没有关系。最近,一些微控制器(例如NXP Cortec-M3)具有可变长度的移位寄存器,因此方向可能很重要。您可以在AVR中的IIRC上先选择MSB或LSB。
stevenvh 2012年

6

比特敲打是指使来自设备或来自设备的信号通过软件而非硬件生成/采样的概念。显然需要一些硬件,但是当使用位敲击时,每个输出的唯一硬件是可以由软件显式设置或清除的锁存器,每个输入的唯一硬件是允许软件测试是否为硬件的接口。高或低(通常对一个状态执行条件分支,而对另一状态则不执行)。

通常,使用位撞击可以达到的最大速度只是专用硬件所能达到的最大速度的一部分,但是在处理器速度所施加的限制之外,位撞击的用途更加广泛,并且可以在某些情况下使用如果通用硬件不太适合,而专用硬件将不会具有成本效益。

例如,许多控制器都有一个“ SPI样式”端口,其行为基本上如下:当将字节写入某个寄存器时,硬件将生成一定数量的时钟脉冲(通常为八个),在时钟上将数据位作为时钟输出。每个时钟脉冲的上升沿,并在下降沿采样输入的数据位。通常,控制器的SPI样式端口将允许配置多种功能,但是在某些情况下,可能有必要将处理器与功能异常的设备接口。设备可能要求以八以外的其他倍数处理数据位,或者可能要求在同一时钟沿上同时输出和采样数据,或者可能有其他一些异常要求。如果一个人正在使用的控制器上的特定硬件可以支持一个人的精确要求,棒极了(有些提供可配置的位数,可分别配置发送和接收时序等)。如果没有,位撞击可能会有所帮助。根据控制器的不同,对SPI ish接口进行位撞击通常需要2到10倍的时间,只要让硬件处理它即可,但是如果要求不符合硬件要求,则较慢地交换数据可能会比根本无法做到。

位碰撞设计要注意的一件事是,在与之通信的设备正在等待位碰撞控制器生成所有时序的环境中,或者允许控制器执行此操作的情况下,它们是最简单,最耐用的设计等待一个事件到来,而不必分心,它可以在任何其他事件到达之前执行该事件所需的所有操作。在设备将需要能够在相对较短的时间内对外部刺激做出反应,但无法将其能量的100%用于监视此类刺激的情况下,它们的鲁棒性要差得多。

例如,假设有人希望处理器以相对于其时钟速度非常高的速率串行发送UART样式的数据(例如,每秒运行8,192条指令的PIC希望以1200 bps的速度输出数据)。如果没有使能中断,则这样的传输并不困难(每七个指令周期时钟一位)。如果PIC除了等待传入的1200bps数据字节外什么也不做,则可以执行3周期循环以等待起始位,然后以7个周期的间隔输入数据。确实,如果PIC有一个字节的数据准备好在传入数据字节到达时发送,那么每位七个周期将足以使PIC在读取传入字节的同时发送其数据字节。同样如果这样的答复相对于原始传输具有固定的时间安排。另一方面,PIC无法以这样的方式处理位爆炸通信,即允许任一设备在其认为合适的任何时间进行传输(而不是让一个设备在其看到时进行传输)装置,并且在不传输时做任何喜欢的事情,以及一个设备,它必须花费大部分时间来做,而只是等待来自第一个设备的传输。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.