Assignment 014:ADC芯片通信程序

以下是课内所讲的TCL1543SPI通信程序中的一段:

static int _tlc1543_rw(const TLC1543* tlc1543,

        int channel, unsigned char buf[2])

{

        while ( digitalRead(tlc1543->eoc_pin) == 0 ) {

        }

        buf[0] = ((unsigned char)channel)<<4;

        buf[1] = 0x00;

        return wiringPiSPIDataRW(tlc1543->spi_channel, buf, 2);

}

注意这个函数是做一次SPI数据通信,要从TCL1543获得数据,需要调用这个函数两次:第一次给出地址,第二次获得数据。请指出其中的问题所在,并给出修改的建议。

 

答:

源程序执行两次_tlc1543_rw,希望第一次给出地址,第二次获得数据。但是该函数中的wiringPiSPIDataRW函数第一次读写后把送入地址保存在buffer里,读出了上一次写入的地址(此时立刻再一次调用wiringPiSPIDataRW函数是可以正确执行任务的,因为数据就在目标地址上)。然而源程序执行两次_tlc1543_rw,第二次的tlc1543->eoc_pin检测后buffer又被修改了,使得目标位置数据不再是需要读的数据。所以应该是调用一次_tlc1543_rw,但是这个函数执行两次wiringPiSPIDataRW

static int _tlc1543_rw(const TLC1543* tlc1543,

        int channel, unsigned char buf[2])

{

        while ( digitalRead(tlc1543->eoc_pin) == 0 ) {

        }

        buf[0] = ((unsigned char)channel)<<4;

        buf[1] = 0x00;

wiringPiSPIDataRW(tlc1543->spi_channel, buf, 2);

        return wiringPiSPIDataRW(tlc1543->spi_channel, buf, 2);

}