amobbs.com 阿莫电子技术论坛

标题: M16与ADS1256通过SPI总线通讯一直调不通 请马老师帮忙看看(急)!! [打印本页]

作者: jindong_000    时间: 2008-4-23 11:15
标题: M16与ADS1256通过SPI总线通讯一直调不通 请马老师帮忙看看(急)!!
最近小弟做一个项目,试图通过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);
}
作者: machao    时间: 2008-4-23 18:01
抱歉,我没使用过ADS1256.
作者: jindong_000    时间: 2008-4-25 18:25
不好意思,是我把仿真器设置错了,上面的程序经仿真没错,可以作为读写ADS1256的基本驱动程序
作者: zhangyunbo    时间: 2011-10-14 10:39
MARK
作者: EysTech    时间: 2013-11-20 21:13
mark                  
作者: ersha4877    时间: 2017-11-4 21:15
while(!(SPSR&0x08));   改成while(!(SPSR&0x80));




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4