这里需要注意的有以下几点:
1. 在SPI_CS片选有效后,TLC2543将把上次AD转换的数据,按MSB在先的顺序,呈现在SPI_DI信号线上,并在SPI_CK的下降沿更新数据;
2. SPI_CK的上升沿将把对AD芯片的操作指令锁存到AD芯片,输出的数据也是按MSB在先的顺序。
3. 输入AD的操作指令只有8个bit,而从AD读出的转换数据有12个bit,在读入低4bit时,输入指令用“0”填充。
4. 芯片数据手册中串行输入输出数据与我们的定义SPI_DO和SPI_DI是正好相反的。
根据上述时序构造的启动AD转换并读取上次转换结果的函数如下:
///////////////////////////////////////////////////////////////////////////////////////
// 输入参数uCmdCode:发送给AD芯片的转换命令,具体内容参考AD数据手册
// 输出参数pADData:从AD读取的数据,低12-bit有效
//////////////////////////////////////////////////////////////////////////////////////
BOOL ReadAD( UCHAR uCmdCode, UINT16* pADData )
{
int i1;
volatile UINT16 ui1, uCmd16;
// activiate AD chipselection
Clear_SPI_CS();
// wait 1.4us before clocking 1st bit (AD TLC2543 required)
EM9160_DelayInUs( 2 );
uCmd16 = (UINT16)uCmdCode << 4; // convert cmd to 12-bit format
ui1 = 0; // save shift-out data from AD
for ( i1 = 0; i1 < 12; i1++ ) // set coverting channel
{
ui1 = ui1 << 1;
if(Get_SPI_DI()) // read AD_DOUT
{
ui1 = ui1 | 0x0001;
}
if( uCmd16 & 0x0800 ) // issue Cmd onto AD_DIN, MSB first
{
Set_SPI_DO();
}
else
{
Clear_SPI_DO();
}
EM9160_DelayInUs( 1 ); // insert delay if required
Set_SPI_CK(); // AD_CLK low-to-high
EM9160_DelayInUs( 1 ); // insert delay if required
Clear_SPI_CK(); // AD_CLK high-tolow
EM9160_DelayInUs( 1 ); // insert delay if required
uCmd16 = uCmd16 << 1;
}
// assign ui1 to ADdata
*pADData = ui1;
// de-activiate AD chipselection
Set_SPI_CS();
// wait for next AD data ready if necessary
Sleep(1);
return TRUE;
}
在程序中最后的Sleep(1),是为了保证在下次调用函数时,AD的数据已转换完毕。应用程序也可采用其他方法来保证AD有足够时间,在应用程序再次调用ReadAD(…)前已完成数据转换。特别需要注意的是,第一次调用ReadAD(…)读取的数据是无意义的,因为此时还没有设置转换命令。在SPI输入输出过程中,是否加入适当的延时,主要是由AD芯片SPI接口的响应速度来决定的,客户可查看所选AD芯片,如TLC2543,的数据手册,就可获得正确的选择。
尽管本文是以EM9160为例来介绍如何构造SPI接口的,这个方法也完全适合英创公司的其他嵌入式工控主板产品,如EM9000、EM9161、EM9260、ETR232i等。对于不同的主板,主要的修改在第二步骤中对SPI接口信号操作函数的实现上。此外,英创公司还准备了3线制SPI接口以及I2C接口的范例参考代码,需要使用的英创用户可联系免费获得。
[查看全文]
[关于英创]
[更多文章]
[技术论坛] 本文PDF格式下载