Распиновка:
PB.8 LATCH
PB.7 SCL
PB.6 MOSI
PB.5 MISO
PB.9 CLEAR
PC.8 FAULT
Код

Код
///..
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)
}
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.
Помогите найти ошибкуи решить задачу
Страно что вообще чтото возвращается.
Для того чтобы чтото получить от SDO, надо передать больше 24 битов, т.е. при передачи 25 бита на SDO сдвигается первый отправленый и т.д.
Т.е. чтобы получить в всю посылку через SDO надо ее повторить дважды.
И еще там вроде надо сначала перевести AD5422 в Daisy-Chain
Для того чтобы чтото получить от SDO, надо передать больше 24 битов, т.е. при передачи 25 бита на SDO сдвигается первый отправленый и т.д.
Т.е. чтобы получить в всю посылку через SDO надо ее повторить дважды.
И еще там вроде надо сначала перевести AD5422 в Daisy-Chain
Так я и читаю сначала код команды чтения а потом отпраляю 0:
Код
temp=WriteToAD5422(0x020002);
temp=WriteToAD5422(0x00);
temp=WriteToAD5422(0x00);
А поповду дэйзи чейн так это если нужно связать несколько цапов