在“线程: ADS1256”中讨论的其他部件
您好,
几天以来,我一直在尝试与我的电路板上的ADC进行通信。 作为n ü µC,我使用的是Atmega168及其硬件SPI引脚。 我已经尝试了不同的SPI模式,但没有成功。 在网上的几个地方,我看到DIN和DOUT (T6)之间的时间间隔非常关键。 所以我在SPI收发器方法中增加了50 µs的延迟。
我想我可以简单地开始读出芯片的状态寄存器。 所以我把命令送到了芯片上。 问题是,即使我将注册表更改为DRATE或其他内容,我也始终在读回"0xFFFFFFFFFFF"。 因此这是无效的。 我是这种ADC通信的新手,所以可能我做了一些完全错误的事情。 我将在此处添加我的代码,也许有人可以立即识别出一些错误。 我还没有使用!DRDY的外部中断。 在主循环中,我只以1000毫秒的间隔读取状态寄存器。
芯片的示例根据第28页的数据集。 非常感谢
#define baud 11.52万UL
#define UBRR0_value (F_CPU/(16*bau)-1)
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrup.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>#include <util/delay.h>#include <ave/interrinterrinterrupt.h>#include <ave_sch;
unchar <us_1<uschar <rch; unch; unsigned <1<rch; unch_1<1<) 1<rchar <rch; unstch; unch+<1<rch; unsigned <rch; unch; unch;<1<1<1<
}
char UART_receive(void){
while (!(UCSR0A &(1<RXC0));
return UDR0;
}
void UARTIinit(){
UBRR0H =(unsigned SCSPI)(UBRR0_valu)>8);
UBRR0L =(unsigned char) UBRCHAR0_value; UC1<C1<C1=<C1<C1<)
<C0=<C01<C1<C1<C1<C+1<C1=1<C1<C1<C1<C1<C1<)
<C+1<C1=
<C1=<C1<C1<C1=<C1<C1=<C1=<C1=<C1=<C1=<C1<C1=<C1<C1=<C1<C1<C1=<C1= C1<C1<C1=
// SPI启用,SPI =主中继器,Prescaler =16
}
unsigned char ADS1255_transceive (unsigned char数据)
{
SPDR =数据;
while (!(SPSR &(1<<SPIF)));
_DELAY _US(50); //等待50µ 直到DOUT (T6)
返回(SPDR);
}
CHAR ADS1255_READ_Status(){
CHAR ANS; //返回变量
PORTB &=~(1 <<PORTB2);// !CS = LOW
_DELAY _US(10);
ADS1255_transceive(0x10|0x00);//发送RREG命令(状态)
_DELAY _US(10);
ADS1255_transceive(0); //读取一个寄存器
_delay_us(10);
ans = ADS1255_transceive(0); //发送虚拟字节并保存返回值
_delay_us(10);
PORTB |=(1<<PORTB2);// !CS =高
_delay_us(10);
返回ans;
}
int main(void){
char test;
ddrd &=~<2);
PORTD |=(1<2);
EICRA |=(1 << ISC00)|(1 << ISC01);
EIMSK |=(1<INT0); // INT0
UARTinit()处的外部中断(!DOUT); // UART
SPI_init(); // SPI
//// sei();
同时(1)
{
测试= ADS1255_READ_Status();
UART_Transmit_CHAR(TEST);
_DELAY _ms(1000);
}
}
ISR(INT0_Vect){//
!DOUT-Interrupt
}






