Bootstrap

AD9826 spi读写源码贡献

AD9826是一款专为成像应用设计的模拟信号处理器,它采用三通道架构,设计用于对三线彩色CCD阵列的输出进行采样和调理。这款处理器集成了多个关键功能组件,包括输入箝位电路、相关双采样器(CDS)、偏移DAC和可编程增益放大器(PGA),并通过多路复用方式接入一个高性能的16位ADC。
它的SPI时序如下图所示:
在这里插入图片描述
一共16bit:
第1位:读写位
第2~4位:地址位
第5~7位:空
第8~16:数据位

对应的写代码实现如下:

static void Ad9826WriteReg(u8 addr,u16 dat)
{
    u16 outDat  = 0;
 //   u16 inDat = 0;
    outDat = (addr<<12)|(dat&0x1FF);
    SCLK_LOW();
    SLOAD_HIGH(); //Disable Operation
    delay_ms(1);
    SCLK_LOW();
    SLOAD_LOW();
    delay_ms(1);

    for(int i = 0; i<16; i++)
    {
        if (outDat&(0x01<<(15-i)))
        {
            SDATA_HIGH();
        }
        else
        {
            SDATA_LOW();
        }

        SCLK_LOW();
        delay_ms(1);
        SCLK_HIGH();
        delay_ms(1);   //Hold 10ns
    }
    SLOAD_HIGH();
    }

对应的读代码实现如下:

static u16 fn_Ad9826ReadReg(u8 addr)
{
    u16 outDat  = 0;
    u16 inDat = 0;
    u16 dat = 0x1FF;

    outDat = (addr<<12)|(dat&0x1FF)|(1<<15);

    SCLK_LOW();
    SLOAD_HIGH(); //Disable Operation
    delay_ms(1);
    SCLK_LOW();
    SLOAD_LOW();
    delay_ms(1);

    for(int i = 0; i<16; i++)
    {
        if (outDat&(0x01<<(15-i)))
        {
            SDATA_HIGH();
        }
        else
        {
            SDATA_LOW();
        }

        SCLK_LOW();
        delay_ms(1);
        inDat = inDat << 1;
        inDat = inDat | SDATA_IN();
        SCLK_HIGH();
        delay_ms(1);   //Hold 10ns
    }
    SLOAD_HIGH();
    dat = inDat&0x1FF;
    return dat;
}
;