beanhu 发表于 2008-4-15 13:47:36

怎么使用ATMEGA16的SPI接口,使TLC2543正常采集数据?

马老师:
    我用12位A/D芯片TLC2543采集电压,由于SPI口的循环移位寄存器是8位,TLC2543在12位分辨率下无法通过直接应用SPI实现,所以我将AD采集方式设定在16位方式下,且MSB导前.再将16位伪数据转换成12为实际数据后,用4位数码管显示. 我没有用到SPI中断方式,而是使SS一直保持低电平,在每一次的While循环下采集通道0的模拟量.
   但数码管显示结果却是0000或4750,而且无论怎么调整通道0的模拟电压值,显示结果均仍为0000或4750保持不变.由此分析,AD采集后的数据要么是0X000,要么是0XFFF.可不知程序问题在哪?请您赐教!
    程序如下:
/*****************************************************

Chip type         : ATmega16
Program type      : Application
Clock frequency   : 4.000000 MHz
Memory model      : Small
External SRAM size: 0
Data Stack size   : 256
Function            : SPI方式下的TLC2543 AD采集电压 由数码管显示
*****************************************************/

#include <mega16.h>
#include <delay.h>
#define SS PORTB.4
#define uchar unsigned char
#define uint unsigned int
uchar shumaguan={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar position={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar adch;//高8位采集数据
uchar adcl;//低8位采集数据
uint AD_data;
uint vot;
uchar dis_buff;
void display(void);
void vot_to_disbuffer(void);

void main(void)
{
uchar clear;
uchar n;

PORTA=0x00;
DDRA=0xFF;

PORTB=0x40;//SPI接口
DDRB=0xB0;//SS SCK MOSI为输出 MISO为输入上拉有效

PORTC=0x00;
DDRC=0xFF;

SPCR=0x50;//主机模式 模式0 高位在前
SPSR=0x01;//由于TLC2543的最高通信频率为4.1MHZ,所以可以选择SPI时钟频率为4MHZ/2=2MHZ
SS=0;
while (1)
      {
       AD_data=0;

       //高8位采集
       SPDR=0x0c;//通道0,16位AD采集方式
       while(!(SPSR&0x80));
       clear = SPSR;
       adch=SPDR;
       //低8位采集
       SPDR=0x0c;通道0,16位AD采集方式
       while(!(SPSR&0x80));
       clear = SPSR;
       adcl=SPDR;
       SS=1;
       //将采集到的16位数据转换为实际的12位数据
       AD_data|=adch;
       AD_data<<=8;
       AD_data|=adcl;
       AD_data>>=4;
      //将12位数字信号转换为电压值后,由数码管显示
       vot_to_disbuffer();
       display();
       for(n=0;n<30;n++)//加上这个循环,稳定显示的数据,便于看清
       display();
      
      }
}

void display(void)
{
uchar i;
for(i=0;i<4;i++)
   {
    PORTC=position;
    PORTA=shumaguan];
    delay_ms(3);
   }
}

void vot_to_disbuffer(void)
{
vot= AD_data*(4750.00f/4095);
dis_buff=vot%10;//0.001v级
dis_buff=vot%100/10;//0.01v级
dis_buff=vot/100%10;//0.1v级
dis_buff=vot/1000;//1v级
}

beanhu 发表于 2008-4-15 13:57:38

更正:
  注意:原程序中,while循环里的 "SS=1;"是没有的 上面的例子是我在发帖时不小心粘上了SS=1

wtwdwr123 发表于 2009-2-20 01:22:00

偶也遇见了这个问题。。。有达人解决了么。。。。估计是时序问题。。。用的是EASYARM1138的spi 想问下这个位传输率一般设置为多少。。。

WOTASOM 发表于 2009-8-25 20:23:00

遇到同样问题,不知道有没有大侠已经解决?

51hubao 发表于 2009-9-18 11:25:20

mark2
页: [1]
查看完整版本: 怎么使用ATMEGA16的SPI接口,使TLC2543正常采集数据?