搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2008-4-15 13:47:36 | 显示全部楼层 |阅读模式
马老师:  
    我用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[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
uchar position[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  
uchar adch;//高8位采集数据
uchar adcl;//低8位采集数据
uint AD_data;
uint vot;
uchar dis_buff[4];
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[dis_buff];
    delay_ms(3);
   }
}

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

出0入0汤圆

 楼主| 发表于 2008-4-15 13:57:38 | 显示全部楼层
更正:
  注意:原程序中,while循环里的 "SS=1;"是没有的 上面的例子是我在发帖时不小心粘上了SS=1

出0入0汤圆

发表于 2009-2-20 01:22:00 | 显示全部楼层
偶也遇见了这个问题。。。有达人解决了么。。。。估计是时序问题。。。用的是EASYARM1138的spi 想问下这个位传输率一般设置为多少。。。

出0入0汤圆

发表于 2009-8-25 20:23:00 | 显示全部楼层
遇到同样问题,不知道有没有大侠已经解决?

出0入0汤圆

发表于 2009-9-18 11:25:20 | 显示全部楼层
mark2
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 19:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表