Помогите разобраться с ЦАПом AD5422. Пробую установить связь между между stm32 и AD5422.
Распиновка:
PB.8 LATCH
PB.7 SCL
PB.6 MOSI
PB.5 MISO
PB.9 CLEAR
PC.8 FAULT

Код
crying.gif
Код
///..
GPIOB->CRH=0x00000033;
GPIOB->CRL=0x33400000;
GPIOC->CRH=0x00000004;
//..
ResetDAC();
temp=WriteToAD5422(0x551005);//uint32_t temp
temp=WriteToAD5422(0x020002);
temp=WriteToAD5422(0x00);

//...
uint32_t WriteToAD5422(uint32_t val)
{
uint8_t c;
GPIOB->BRR=1<<8;  //clr latch
for(c = 0; c < 24; c++)
    {
        
        GPIOB->BRR=1<<7;//SCK_CLEAR()//;

        if(val & 0x00800000)
        GPIOB->BSRR=1<<6;//MOSI_SET()//;
        else
        GPIOB->BRR=1<<6;////MOSI_CLEAR()//;

        Delay();
        GPIOB->BSRR=1<<7;//GPIO_BSRR_BS10;//1<<10;// SCK_SET()//;
        Delay();
        val <<= 1;
        if(GPIOB->IDR & (1<<5))
        val |= 0x01;
        Delay();
     }
GPIOB->BRR=1<<7;  //clr sck
Delay();
GPIOB->BSRR=1<<8;     //set latch
Delay();
return val;

}

void    ResetDAC    ()
{
uint32_t    temp=0;
GPIOB->BRR=1<<7;
GPIOB->BSRR=1<<8;
GPIOB->BRR=1<<9;

temp=WriteToAD5422(0x560001);//запись в регитср сброса (адрес 0х56)
}


В итоге temp=WriteToAD5422(0x551005); возвращает 0х05000000;
temp=WriteToAD5422(0x020002); возвращает 0х02000000;temp=WriteToAD5422(0x00) возвращает 0,
то есть последний записанный байт.

Если настроить функцию uint32_t WriteToAD5422(uint32_t val) на отправку по 8 бит, то темп возвращает постояннг 0. Это впринципе и понятно, т.к.по идее (согласно даташиту) LATCH устанавливается после отправки 24 бит.
Возможности связат по аппаратному SPI нет. Используется МК stm32f103vet. Функция задержки запускает таймер 2 на 85 нс.
настройки таймера Prescaller=0, ARR=3.
Помогите найти ошибкуи решить задачу

Цитата(Matic @ Nov 23 2011, 14:03) *
Страно что вообще чтото возвращается.
Для того чтобы чтото получить от SDO, надо передать больше 24 битов, т.е. при передачи 25 бита на SDO сдвигается первый отправленый и т.д.
Т.е. чтобы получить в всю посылку через SDO надо ее повторить дважды.

И еще там вроде надо сначала перевести AD5422 в Daisy-Chain


Так я и читаю сначала код команды чтения а потом отпраляю 0:
Код
temp=WriteToAD5422(0x020002);
temp=WriteToAD5422(0x00);


А поповду дэйзи чейн так это если нужно связать несколько цапов