在做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。