|
求助--我使用CS5532做AD转换SDO一直不会变低
调试很久都不行,不知道为什么
哪位高手有成功使用 的 代码, 先谢谢了!
我的代码如下:
#ifndef _cs5532_h_
#define _cs5532_h_ 1
/*
//================================
// CS5532驱动
// AVR_C代码 M8
// knight
//=================================
*/
#include <avr/io.h>
#include "macros.h"
#include "define.h"
#include "func.h"
#include "spi.h"
#define SYNC1 0xff
#define SYNC0 0xfe
#define CMD0 0
#define ARA BIT(6) /*整列方式访问通道0、1的寄存器*/
#define CS0 4
#define CS1 5
#define CMD0_COMM0 (BIT(CS0))
#define CMD0_COMM1 (BIT(CS1))
#define CMD0_WRITE 0
#define CMD0_READ BIT(3)
#define CMD0_reg_offset 0x01
#define CMD0_reg_gain 0x02
#define CMD0_reg_config 0x03
#define CMD0_reg_data 0x04
#define CMD0_reg_cconfig 0x05
#define CMD1 0x80
#define CMD1_step 0
#define CMD1_continue BIT(6)
#define CMD1_cconfig(x) ((x)<<3)
#define CMD1_convert 0
#define CMD1_adj_offset 1
#define CMD1_adj_gain 2
#define CMD1_adj_sys_offset 5
#define CMD1_adj_sys_gain 6
////配置寄存器
#define PSS 7 /* 节电模式选择 */
#define PDW 6 /* 节电模式 */
#define RS 5 /* 系统复位 */
#define RV 4 /* 复位有效 */
#define IS 3 /* 输入短路 */
#define GB 2 /* 保护信号位 */
#define VRS 1 /* 参考电压选择 */
#define A1 0 /* 输出锁存位1 */
#define A0 7 /* 输出锁存位0 */
#define OLS 6 /* 输出锁存选择 */
////通道配置寄存器
#define cc_CS1 7
#define cc_CS0 6
#define cc_G2 5
#define cc_G1 4
#define cc_G0 3
#define GEN64 ( BIT(cc_G2)|BIT(cc_G1) )
#define GEN32 ( BIT(cc_G2)|BIT(cc_G0) )
#define cc_WR3 2
#define cc_WR2 1
#define cc_WR1 0
#define cc_WR0 7
#define cc_UB 6
#define cc_OL1 5
#define cc_OL0 4
#define cc_DT 3
#define cc_OCD 2
#define isADCnotReady() ( PINB & BIT(SDO) )
//=======================================
// CS5532初始化程序
// 作用:cs5532 AD转换器
//=======================================
void
init_cs5532(void)
{
uint8_t i;
disable_spi();//SPI禁止
delay1us();
enable_spi();//SPI使能
delay1us();
clrbit(SPI_PORT,SDI);
setbit(SPI_PORT,SDO);
clrbit(SPI_PORT,SCK);
////进入命令模式
for (i=0;i<18;i++) SPI_RWBYTE(SYNC1);
SPI_RWBYTE(SYNC1);
delay1us();
////RS=1复位 (写配置寄存器)
SPI_RWBYTE( CMD0|CMD0_COMM0|CMD0_WRITE|CMD0_reg_config);
SPI_RWBYTE(BIT(RS));
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
delay1us();
i=0;
while ( !isbit(i,RV) ) //等待复位完毕
{
SPI_RWBYTE(CMD0|CMD0_COMM0|CMD0_READ|CMD0_reg_config); //读配置寄存
delay1us();
i=SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
}
////配置寄存器
SPI_RWBYTE( CMD0|CMD0_COMM0|CMD0_WRITE|CMD0_reg_config);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x58);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x58);
//通道0设置寄存器
SPI_RWBYTE(CMD0|CMD0_COMM0|CMD0_WRITE|CMD0_reg_cconfig);
SPI_RWBYTE( 0x40 );//GEN64|BIT(cc_WR1) );
SPI_RWBYTE( 0x30 );
SPI_RWBYTE( 0x40 );//GEN64|BIT(cc_WR1) );
SPI_RWBYTE( 0x30 );
//偏移寄存器 0
SPI_RWBYTE(CMD0|CMD0_COMM0|CMD0_WRITE|CMD0_reg_offset);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
//增益寄存器 增益64倍
SPI_RWBYTE(CMD0|CMD0_COMM0|CMD0_WRITE|CMD0_reg_gain);
SPI_RWBYTE( 0x3f );//BIT(5));
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
SPI_RWBYTE(0x00);
delay1us();
//执行校准
SPI_RWBYTE(CMD1|CMD1_adj_offset);//自偏移校准
_delay_us(100);
SPI_RWBYTE(CMD1|CMD1_adj_gain); //自增益校准
_delay_us(100);
////while(isADCnotReady());
}
//=======================================
// CS5532开始转换
// 作用:发送转换命令
// i=0,1 通道号
//=======================================
uint8_t adcstatu;
#define isADCOver 0
#define isoverflow 1
void
start_adc(uint8_t n)
{
if ( isbit(adcstatu,isADCOver) )
{
clrbit(SPI_PORT,SCK);//时钟低
enable_spi();
delay1us();
SPI_RWBYTE( CMD1 | CMD1_step | CMD1_cconfig(n)| CMD1_convert );
clrbit(adcstatu,isADCOver); //清0 标记正在转换中,数据还未读取
delay1us();
disable_spi();
}
}
//=======================================
// 读CS5534转换数据
// 作用:当ADC转换完毕后
// 发送空字节,读取数据
// i=0,1,2,3 通道号
//=======================================
bool
cs5532_read(int32_t* value)
{
uint32_t val;
uint8_t c;
start_adc(0);
clrbit(SPI_PORT,SCK);
NOP();
clrbit(SPI_PORT,SDI);
clrbit(SPI_PORT,SDO);
enable_spi(); //SPI禁止
_delay_us(100);
delay1us();
if ( isbit(SPI_PIN,SDO) )
{
return false;
};
uart_send_byte(2);
clrbit(SPI_PORT,SCK); //时钟低
enable_spi(); //SPI使能
delay1us();
//SPI_RWBYTE(CMD0|CMD0_COMM0|CMD0_READ|CMD0_reg_data);
//SPI_RWBYTE(CMD0|CMD0_COMM0|CMD0_READ|CMD0_reg_gain);
//SPI_RWBYTE(CMD0|CMD0_COMM0|CMD0_READ|CMD0_reg_config);
delay1us();
val=SPI_RWBYTE(0x00);
val<<=8;
val|=SPI_RWBYTE(0x00);
val<<=8;
val|=SPI_RWBYTE(0x00);
val<<=8;
val|=SPI_RWBYTE(0x00);
setbit(adcstatu,isADCOver); //置1 标记这次转换完成,数据已经读取
disable_spi();//SPI禁止
delay1us();
c=val.arr[0];
if (val.arr[3]&0x80)
{
*value=(((~val.val)+1)/0x100);
}
else
{
*value = (val.val/0x100);
}
if (c&0x04)
{
adcstatu|=BIT(isoverflow);
return false;
}
else
{
adcstatu&=~BIT(isoverflow);
}
return true;
}
#endif |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|