在做ISD4004语音芯片驱动程序时,欲读取录音或者放音的地址,编了一段程序如下所示。但是,程序一直执行错误。

/***************************************************************
函数功能:SPI串行发送24位命令并同时接收24位数据的函数,接收的8位数
          据高位低位反向(*|*|*|*|*|P16|···P1|P0|EOM|OVF|0|0|0|0|0|0|0|0)
****************************************************************/
unsigned long spi_24bit_tr(unsigned char isd_cmd,unsigned char address_h,unsigned char address_l)
{
unsigned long isd_txd = 0;
unsigned long isd_rxd = 0;
unsigned char count;
    isd_txd = ((isd_cmd<<16)|(address_h<<8)|(address_l));
    SS = 0;
    for(count=0;count<24;count++) {
        isd_rxd = isd_rxd >> 1;     
        MISO = 1;
        if (MISO){
            isd_rxd = isd_rxd | 0x80000000;
        }  
        if (isd_txd & 0x01){        
            MOSI = 1;
        }
        else{
            MOSI = 0;
        }
        isd_txd = isd_txd >> 1;         
        SCLK = 1;
        _nop_();
         SCLK = 0;
        _nop_();
    }              
    SS = 1;      
return isd_rxd;     
}

(一)在keil中关于红色那行进行了测试

测试结果如下:

可以看到,isd_txd并不是我们想要的结果,isd_cmd<<16这部分丢失了,强制类型转换后,就得到了理想的效果。

(二)在vc6.0上重新做上边的实验

没有强制类型转换的测试效果

加上强制类型转换的效果

结论:

1.强制类型转换对于程序的可靠性是必须的,而且对于程序的可读性也是有益的;不要把希望寄托于编译器来完成类型转换

2.不同的编译器对不同类型数据默认的转换处理是不一样的,例如本文涉及的keil和vc6.0。

posted on 2013-11-11 20:41  amanlikethis  阅读(802)  评论(0编辑  收藏  举报