#include "ad9826.h"
//#include "stm32f10x_type.h"
#include "stm32f10x_gpio.h"
GPIO_InitTypeDef GPIO_InitStructure_ad;
#define SCLK_LOW() (GPIO_ResetBits(GPIOB, GPIO_Pin_10))
#define SCLK_HIGH() (GPIO_SetBits(GPIOB, GPIO_Pin_10))
#define SLOAD_LOW() (GPIO_ResetBits(GPIOA, GPIO_Pin_8))
#define SLOAD_HIGH() (GPIO_SetBits(GPIOA, GPIO_Pin_8))
#define SDATA_LOW() (GPIO_ResetBits(GPIOA, GPIO_Pin_0))
#define SDATA_HIGH() (GPIO_SetBits(GPIOA, GPIO_Pin_0))
#define CDSCLK2 GPIO_Pin_4
#define ADCCLK GPIO_Pin_6
#define CDSCLK1 GPIO_Pin_2
/* Function : Write value into register of AD9826
* Parameter:
-addr : register addreess.
-dat : value,only low 8bit is valid.
* 3-SHA模式:
* CDSCLK2的下将沿开始采样。
* ADC在ADCCLK 的下将沿输出16Bit的采样数据,分别在ADCCLK
的下将和上升沿以8Bit的长度输出。
* CDSCLK2应该在ADCCLK变高前变低;在上一个ADCCLK变低之前,
CDSCLK2不应该变高。
* 输出数据要占用三个ADCCLK周期。
*/
void AD9826_Write_Reg(unsigned char addr,unsigned short dat)
{
s8 i;
u8 tmp;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8; //LED1 V6 //将V6,V7,V8 配置为通用推挽输出
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_2MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure_ad);
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_10; //LED1 V6 //将V6,V7,V8 配置为通用推挽输出
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_2MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure_ad);
SLOAD_HIGH(); //Disable Operation
//Write Flag
SDATA_LOW();
SCLK_LOW();
Delay(256); //?????
SLOAD_LOW();
Delay(256); // SLOAD to SCLK Set-Up Time >= 10ns (Min)
SCLK_HIGH();//Indicate Write operation
Delay(256);
for(i=2;i>=0;i--)
{//Write Address
tmp=addr & (1<<i);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)(tmp>>i));
SCLK_LOW();//Write ont bit
Delay(256);
SCLK_HIGH();
Delay(256); //Hold 10ns
}
for(i=0;i<3;i++)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)(0));
SCLK_LOW();//Write ont bit
Delay(256);
SCLK_HIGH();
Delay(256); //Hold 10ns
}
for(i=8;i>=0;i--)
{//Write Data
tmp=dat & (1<<i);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)(tmp>>i));
SCLK_LOW();
Delay(256);
SCLK_HIGH();
Delay(256);
}
SLOAD_HIGH();
}
u16 AD9826_Read_Reg(u8 addr)
{
s8 i;
u16 tmp;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_2MHz; //口线翻转速度为2MHz
GPIO_Init(GPIOA, &GPIO_InitStructure_ad);
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_10; //
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_2MHz; //口线翻转速度为2MHz
GPIO_Init(GPIOB, &GPIO_InitStructure_ad);
// GPIO_PIN_Cfg(GPIOC,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3,\
// GPIO_Mode_Out_PP,GPIO_Speed_2MHz);//Change Pin mode
SLOAD_HIGH();
GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)(1));
SCLK_LOW();
SLOAD_LOW();
Delay(256);
SCLK_HIGH();
Delay(256);
for(i=2;i>=0;i--)
{//Write Address
tmp=addr & (1<<i);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)(tmp>>i));
SCLK_LOW();//Write ont bit
Delay(256);
SCLK_HIGH();
Delay(256); //Hold 10ns
}
for(i=0;i<3;i++)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)(0));
SCLK_LOW();//Write ont bit
Delay(256);
SCLK_HIGH();
Delay(256); //Hold 10ns
}
tmp=0;
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_0; //
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_2MHz; //口线翻转速度为2MHz
GPIO_Init(GPIOA, &GPIO_InitStructure_ad);
//GPIO_PIN_Cfg(GPIOC,GPIO_Pin_1,GPIO_Mode_IPD,GPIO_Speed_2MHz); //Change Pin mode
Delay(256);
for(i=8;i>=0;i--)
{//Read Data
SCLK_LOW();
Delay(256);
SCLK_HIGH();
tmp<<=1;
tmp|=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
//printf("i=%d,tmp=0x%x\r\n",i,tmp);
Delay(256);
}
// tmp=tmp>>1;//BUG,目前暂时用这种方式修正
SLOAD_HIGH();
return tmp;
}
//void Set_Default_Config_Reg(void)
//{
// AD9826_Write_Reg(ADDR_CFG,CFG_FOR_COLOR);
//}
//void Set_Default_Mux_Reg()
//{
// AD9826_Write_Reg(ADDR_MUX,MUX_FOR_COLOR);
//}
/*
* parameter:
* state: 0=low,1=high
*/
static void Set_ADCCLK(u8 state)
{
if(state==0x00)
{
GPIO_ResetBits(GPIOE,ADCCLK);
GPIO_ResetBits(GPIOE,GPIO_Pin_3);
}
else if(state==0x01)
{
GPIO_SetBits(GPIOE,ADCCLK);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
}
}
/*
* parameter:
* state: 0=low,1=high
*/
static void Set_CDSCLK1(u8 state)
{
if(state==0x00)
{
GPIO_ResetBits(GPIOE, CDSCLK1);
GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}
else if(state==0x01)
{
GPIO_SetBits(GPIOE, CDSCLK1);
GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
}
/*
* parameter:
* state: 0=low,1=high
*/
static void Set_CDSCLK2(u8 state)
{
if(state==0x00)
{
GPIO_ResetBits(GPIOE, CDSCLK2);
GPIO_ResetBits(GPIOE, GPIO_Pin_0);
}
else if(state==0x01)
{
GPIO_SetBits(GPIOE, CDSCLK2);
GPIO_SetBits(GPIOE, GPIO_Pin_0);
}
}
static u8 AD9826_Read_Byte()
{
u16 dat;
dat=GPIO_ReadInputData(GPIOC);
return (u8)(dat & 0xff);
}
u16 Sha1_Sample_Rgb(void)
{
u16 rgbx;//{red,green,blue}
u8 i;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_10MHz; //口线翻转速度为2MHz
GPIO_Init(GPIOC, &GPIO_InitStructure_ad);
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为2MHz
GPIO_Init(GPIOE, &GPIO_InitStructure_ad);
// GPIO_PIN_Cfg(GPIOA,0xFF,GPIO_Mode_IPD,GPIO_Speed_2MHz);
// AD9826_Disable();
Set_ADCCLK(0);
Set_CDSCLK1(0);
//Set_CDSCLK2(1);
Set_CDSCLK2(0);
// AD9826_Enable();
Set_ADCCLK(0);
Set_CDSCLK2(0);
Delay(256); //>=5ns
Set_CDSCLK2(1);
Delay(256); //>=5ns
Set_ADCCLK(1); //ADCCLk Pulsewidth >= 30ns
Delay(256);//>=6ns
Set_CDSCLK2(0);
Delay(256); //>=5ns
rgbx=AD9826_Read_Byte();
Delay(256);
Set_ADCCLK(0);
Delay(512);//>=6ns
rgbx=(rgbx<<8)|AD9826_Read_Byte();
Delay(256);//>=10ns
// AD9826_Disable();
return (rgbx);
}
void Sha3_Sample_Rgb(u16 rgb[3])
{
//u16 rgb[3];//{red,green,blue}
u8 i;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_10MHz; //口线翻转速度为2MHz
GPIO_Init(GPIOC, &GPIO_InitStructure_ad);
GPIO_InitStructure_ad.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure_ad.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure_ad.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为2MHz
GPIO_Init(GPIOE, &GPIO_InitStructure_ad);
// GPIO_PIN_Cfg(GPIOA,0xFF,GPIO_Mode_IPD,GPIO_Speed_2MHz);
// AD9826_Disable();
Set_ADCCLK(0);
Set_CDSCLK1(0);
//Set_CDSCLK2(1);
Set_CDSCLK2(0);
// AD9826_Enable();
Set_ADCCLK(0);
Set_CDSCLK2(0);
Delay(256); //>=5ns
Set_CDSCLK2(1);
Delay(256); //>=5ns
Set_CDSCLK2(0);
Delay(256); //>=5ns
for(i