|
发表于 2011-8-19 09:37:51
|
显示全部楼层
回复【2楼】yylooker
-----------------------------------------------------------------------
我用过ADS1256,但转换结果不线性,没找到原因,占时放到,当时SPI通信也是搞了一阵,后来能读数据了,发现要将SCLK在一次操作完后,置成低电平。如果是硬件SPI则(SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟悬空为低)
另,记得有个脚可以输出时钟(DO/CLKOUT),不知你那个片子有没有,测试时,写相当寄存器,可以改变这个脚的输出频率,如查频率可控制了,那写入的数据就正确了。
参考程序:(注:测试能转换,读写数据,但转换结果不线性,???)
平台: MDK
MCU: STM32 72MHz
#define DCLK 12 //PD
#define CS 8 //PD
#define DIN 10 //PD
#define DOUT 11 //PD
#define AD_RD 9 //PD
/**/
#define DCLK_H (GPIOD->ODR |= (1<<DCLK))
#define DCLK_L (GPIOD->ODR &= ~(1<<DCLK))
#define CS_H (GPIOD->ODR |= (1<<CS))
#define CS_L (GPIOD->ODR &= ~(1<<CS))
#define DOUT_H (GPIOD->ODR |= (1<<DIN))
#define DOUT_L (GPIOD->ODR &= ~(1<<DIN))
#define DOUT_pin GPIOD
void delayad_nopar(void)
{
u16 i = 500;
while(i--);
}
//在SCLK的下降沿,系统通过DIN向ADSl256发送数据; ??
//而在SCLK的上升沿,系统则通过DOUT从ADSl256读取数 ??
// *****************************************************************************
// Function Name : ads1256_wr
// Description : SPI写数据
// Input : None
// Output : None
// Return : None
// *****************************************************************************
void SendSPIByte(u8 num)
{
u8 count=0;
DCLK_L;
for(count=0;count<8;count++)
{
if((num&0x80)==0)
DOUT_L; //pd10
else DOUT_H;
DCLK_H;
delayad_nopar();
DCLK_L;
delayad_nopar();
num<<=1;
}
//CS_H();
}
// *****************************************************************************
// Function Name : ads1256_rd
// Description : SPI 读数据
// Input : None
// Output : None
// Return : None
// *****************************************************************************
u8 GetSPIByte(void)
{
u8 i=8,d;
DCLK_L;
while(i--)
{
d <<=1;
DCLK_H;
delayad_nopar();
DCLK_L;
delayad_nopar();
DOUT_H;
if(GPIO_ReadInputDataBit(DOUT_pin, GPIO_Pin_11) != 0)
d |= 0x01;
else
d &= 0xfe;
}
return d;
}
//-----------------------写数据到选择的寄存器中-----------------------------
void write_register(u8 addr,u8 date)
{
u8 i,j;
u8 send[] = {0x50,0x00,0x00};
send[0] |= addr;
send[2] |= date;
j=3;
while(R_AD);
for(i=0;i<j;i++)
{
SendSPIByte(send);
}
}
//-----------------------从选择的寄存器中读出寄存器中的数据-----------------------------
u8 read_register(u8 addr)
{
u8 i,j;
u8 send[] = {0x10,0x00};
send[0] |= addr;
j=2;
while(R_AD);
for(i=0;i<j;i++)
{
SendSPIByte(send);
}
for(i=0;i<183;i++);
send[0]=GetSPIByte();
return send[0];
} |
|