/*************************************************************************
* 名称: SPI_MasterInit
* 功能: SPI主机模式初始化
* 参数: 无
* 返回: 无
*************************************************************************/
void SPI_MasterInit(void)
{
SPCTL = 0xce; //SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0
SPSTAT = 0XC0; //SPDAT.7和SPDAT.6写11,可以将中断标志清零。注意是写1才清零
SPDAT = 0x00; // 数据寄存器清空
}
/*************************************************************************
* 名称: void SPI_MasterTransmit(uint8_t cData)
* 功能: SPI主机模式传送数据
* 参数: cData 要传输的字节数据
* 返回: SPI接收值
*************************************************************************/
unsigned char SPI_MasterTransmit(unsigned char cData)
{
SPSTAT=0xc0; // 每次传输完成都要清除标志位,因为传完一个字节就置1了
SPDAT=cData;
while(!(SPSTAT&0x80)); // 重要,判断标识位,等待SPI传送结束才能开始下一步
return SPDAT;
}
/*************************************************************************
* 名称: Tlc2543_GetAdc
* 功能: 获取指定通道前一次转换结果
* 参数: cChannel通道
* 返回: 12位ADC
*************************************************************************/
unsigned int Tlc2543_GetAdc(unsigned char cChannel)
{
unsigned char tmp;
unsigned int dAdc;
cChannel = (cChannel << 4) | 0x0C; //16(伪)位精度MSB在先
CS=0;
dAdc = SPI_MasterTransmit(cChannel); //高位字节
tmp = SPI_MasterTransmit(cChannel); //地位字节
CS=1;
dAdc <<= 8;
dAdc |= tmp;
dAdc >>= 4; //去12位有效位
return dAdc;
}
我在主函数中进行读取AD通道值,为什么会是在“while(!(SPSTAT&0x80));”?
请教各位这是为什么?会死在等待?我按照资料上的要求写的程序?这是怎么回事? |