Распиновка:
PB.8 LATCH
PB.7 SCL
PB.6 MOSI
PB.5 MISO
PB.9 CLEAR
PC.8 FAULT
Код:
Код:
Код
:crying:
///..
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.
Помогите найти ошибкуи решить задачу