#include "io430.h"
#include "spwm.h"
#include "init.h"
#include "voltage.h"
#include "portdef.h"
#define uchar unsigned char
#define FALSE 0
#define TRUE 1
#define RDATAC 0x10
#define SDATAC 0x11
#define Addr_ID 0x00
#define Addr_CONFIG1 0x01
#define Addr_CONFIG2 0x02
#define Addr_LOFF 0x03
#define Addr_CH1SET 0x04
#define Addr_CH2SET 0x05
#define Addr_RLD_SENS 0x06
#define Addr_LOFF_SENS 0x07
#define Addr_LOFF_SSTAT 0x08
#define Addr_RESP1 0x09
#define Addr_RESP2 0x0A
#define Addr_GPIO 0x0B
int t=1;
char MST_Data = 0xAA,SLV_Data = 0xff;
unsigned char a[12];
unsigned char b[12];
unsigned char regdata[11]={0x02,0xa3,0x10,0x05,0x05,0x00,0x00,0x40,0xc3,0x00,0x03};//内部测试信号
//unsigned char regdata[11]={0x02,0xe3,0x10,0x00,0x00,0x30,0x0f,0x40,0x02,0x01,0x03};//二通道心电测试信号,无呼吸
int m;
void delay_ms(int ms)
{
int i,j;
for(j=0;j<ms;j++)
for(i=0;i<8000;i++);
}
void delay_us(int us)
{
int i,j;
for(j=0;j<us;j++)
for(i=0;i<8;i++);
}
//-------------------------------------------------------------------------
// 发送ADS1198单字节命令
//-------------------------------------------------------------------------
void ADS1198_Send_CMD_One(uchar cmd)
{
while (!(UCB1IFG&UCTXIFG)); // USCI_B0 TX buffer ready?
UCB1TXBUF = cmd; // Transmit data
//UCA1TXBUF = cmd;
}
void ADS1198_Read_CMD_One()
{
while (!(UCB1IFG&UCRXIFG)); // USCI_B0 TX buffer ready?
while (!(UCA1IFG&UCTXIFG)); // 接收数据字节
UCA1TXBUF = UCB1RXBUF; // Transmit data
}
void ADS_REG(unsigned char com,unsigned data)
{
unsigned char i;
for(i=0;i<45;i++);
ADS1198_Send_CMD_One(com);
for(i=0;i<45;i++);
ADS1198_Send_CMD_One(0X00);
for(i=0;i<45;i++);
ADS1198_Send_CMD_One(data);
}
void ADS_RREG(unsigned char com)
{
unsigned char i;
for(i=0;i<45;i++);
ADS1198_Send_CMD_One(com);
for(i=0;i<45;i++);
ADS1198_Send_CMD_One(0X00);
for(i=0;i<45;i++);
ADS1198_Read_CMD_One();
}
//-------------------------------------------------------------------------
// 传输ADS1198多字节命令
//-------------------------------------------------------------------------
void ADS1198_Send_CMD_Muti(uchar cmd,uchar len,uchar dat[])
{
uchar i;
ADS1198_Send_CMD_One(cmd); // 发送第一字节命令+地址
ADS1198_Send_CMD_One(len-1); // 发送第二字节命令,发送数据长度
for(i=0;i<len;i++)
{
ADS1198_Send_CMD_One(dat[i]); // 发送多字节数据
}
}
//-------------------------------------------------------------------------
// 接收ADS1198多字节命令
//-------------------------------------------------------------------------
uchar ADS1198_Recive_Data(uchar cmd,uchar len,uchar dat[])
{
uchar i;
ADS1198_Send_CMD_One(cmd); // 发送接收命令第一字节+地址
ADS1198_Send_CMD_One(len-1); // 发送接收第二字节命令,接收数据长度
for(i=0;i<len;i++)
{
//ADS1198_Send_CMD_One(0); // 发送SPI时钟,DOUT=0
if(UCB1IFG&UCRXIFG) // 判断接收标志
{
dat[i] = UCB1RXBUF; // 接收数据字节
while (!(UCA1IFG&UCTXIFG)); // 接收数据字节
UCA1TXBUF = dat[i];
}
else
{
return FALSE;
}
}
return TRUE;
}
//-------------------------------------------------------------------------
// 连续采集模式下接收数据
//-------------------------------------------------------------------------
void ADS_Read()
{
unsigned char i;
_CS;
for(i=0;i<9;i++);
ADS1198_Send_CMD_One(0X00);
for(i=0;i<9;i++);
if(UCB1IFG&UCRXIFG) // 判断接收标志
{
while (!(UCA1IFG&UCTXIFG)); // 接收数据字节
//UCA1TXBUF = UCB1RXBUF; // 接收数据字节
UCA1TXBUF = UCB1RXBUF;
}
CS;
for(i=0;i<9;i++);
}
//-------------------------------------------------------------------------
void ADS1198_Init(void)
{
uchar d[8];
START; // 禁止采集
CS;
_RESET;
delay_ms(100);
RESET; // 复位置高
delay_ms(1000); // 延时1S
_RESET; // 复位1198
delay_ms(200); // 延时100MS
RESET; // 复位清除
delay_ms(100);
_START;
_CS;
delay_us(1);
ADS1198_Send_CMD_One(SDATAC); // 发送停止命令
delay_us(8);
ADS_RREG(0x20|Addr_ID);
ADS_REG(0x40|Addr_CONFIG2,0XA8);
delay_ms(10);
ADS_RREG(0x20|Addr_CONFIG2);
ADS_REG(0x40|Addr_CONFIG1,0X01);
ADS_RREG(0x20|Addr_CONFIG1);
ADS_REG(0x40|Addr_LOFF,0XF0);
ADS_RREG(0x20|Addr_LOFF);
ADS_REG(0x40|Addr_CH1SET,0X65);
ADS_RREG(0x20|Addr_CH1SET);
ADS_REG(0x40|Addr_CH2SET,0X65);
ADS_RREG(0x20|Addr_CH2SET);
ADS1198_Send_CMD_One(RDATAC); // 连续读命令
START; // 开始数据采集
// }
}
int main(void)
{
WDTCTL = WDTPW|WDTHOLD; // Stop watchdog timer
System_init(); //系统时钟设置
UART_init(); //串口初始化以及配置
SPI_init(); //SPI初始化以及配置
ADS1198_Init();
while(1)
{
if((P4OUT & BIT6)==0x00)
ADS_Read();
}
}
上面是ADS1292的硬件电路图,以及网上移植过来的代码,现在出现问题是不能读写寄存器,但是DRDY(500HZ)以及时钟信号(4MHZ)都能正常产生。想请问一下是硬件问题还是程序的时序或者什么问题,已经调试很久没有调通。