amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 5714|回复: 5

M16与ADS1256通过SPI总线通讯一直调不通 请马老师帮忙看看(急)!!

[复制链接]
发表于 2008-4-23 11:15:40 | 显示全部楼层 |阅读模式
最近小弟做一个项目,试图通过M16自身的SPI总线访问兼容SPI总线协议的24位高精度AD芯片,TI公司的ADS1256,可是ADS1256的驱动程序怎么都调不通,公司领导逼的又急,我快被折磨死了。现把部分程序贴出来,希望有用过ADS1256这款芯片的大虾指点一二,小弟在此先谢过了。
***************************ADS1256.H******************************
#ifndef ads1256_h
#define ads1256_h
//ADS1256内部寄存器定义
#define STATUS 0x00
#define MUX 0x01
#define ADCON 0x02
#define DRATE 0x03
#define IO 0x04
#define OFC0 0x05
#define OFC1 0x06
#define OFC2 0x07
#define FSC0 0x08
#define FSC1 0x09
#define FSC2 0x0A

//访问ADS1256命令字节定义
#define WAKEUP 0x00
#define RDATA  0x01
#define RDATAC 0x03
#define SDATAC 0x0f
#define RREG 0x10
#define WREG 0x50
#define SELFCAL 0xF0
#define SELFOCAL 0xF1
#define SELFGCAL 0xF2
#define SYSOCAL 0xF3
#define SYSGCAL 0xF4
#define SYNC 0xFC
#define STANDBY 0xFD
#define RESET  0xFE
#endif

/**************main.c*********************
初始化ADS1256相关寄存器,然后把配置数据读出,
以此来验证数据是否被正确地写入ADS1256,以及
ADS1256是否正确工作(不知道这么做意义大不大,但我找不到更好的验证办法了
我们公司很抠门,连一台上百MHZ的示波器都没有!!!)

端口连接方式:
MISO---------------DOUT
MOSI---------------DIN
SCK----------------SCLK
PB3---------------/DRDY
/SS悬空            /CS接地
M16L采用7.3728M晶振,ADS1256采用7.68M晶振
***********************************/
#include <iom16v.h>
#include "ads1256.h"
#include <macros.h>
unsigned char ads1256[4];
void delay_n_us(unsigned char N)
{
while(N)
{
NOP();
NOP();
NOP();
NOP();
N--;
}
}
/********SPI初始化*****************/
void spi_init(void)
{
DDRB|=0xB0;//PB7,PB4,PB5输出,PB3,PB6输入
PORTB|=0x48;//使能内部上拉
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPHA);//SPI使能,主机方式,Fosc/16,01模式
}
/*************SPI发送接收子程序(命令或数据字节)***********************/
unsigned char spi_TranByte(unsigned char cdata)
{
SPDR=cdata;
while(!(SPSR&0x08));
return (SPDR);
}
void main(void)
{
  
spi_init();//
while(PINB&0x08);///DRDY=0才可写ADS1256寄存器
spi_TranByte(WREG|STATUS);//写寄存器首地址
spi_TranByte(0x00);//只操作一个寄存器
spi_TranByte(0x06);//数据字节,配置ADS1256输出数据高字节高位在前
delay_n_us(10);//命令间延时
while(PINB&0x08);
spi_TranByte(WREG|ADCON);
spi_TranByte(0x01);//写ADCON和DRATE寄存器
spi_TranByte(0x03);
spi_TranByte(0xE0);
delay_n_us(10);//
spi_TranByte(RREG|ADCON);//读寄存器首地址
spi_TranByte(0x02);//连续读3个寄存器
delay_n_us(20);//
ads1256[0]=spi_TranByte(0xff);
ads1256[1]=spi_TranByte(0xff);
ads1256[2]=spi_TranByte(0xff);
ads1256[3]=spi_TranByte(0xff);
}
发表于 2008-4-23 18:01:50 | 显示全部楼层
抱歉,我没使用过ADS1256.
 楼主| 发表于 2008-4-25 18:25:53 | 显示全部楼层
不好意思,是我把仿真器设置错了,上面的程序经仿真没错,可以作为读写ADS1256的基本驱动程序
发表于 2011-10-14 10:39:53 | 显示全部楼层
MARK
发表于 2013-11-20 21:13:10 | 显示全部楼层
mark                  
发表于 2017-11-4 21:15:08 | 显示全部楼层
while(!(SPSR&0x08));   改成while(!(SPSR&0x80));
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-10-19 01:35

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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