Помогите разобраться с ЦАПом
AD5422. Пробую установить связь между между stm32 и AD5422.
Распиновка:
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_1();
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 (uint8_t Pin_SCK, uint8_t Pin_MISO, uint8_t Pin_MOSI,GPIO_TypeDef * GPIOx, uint8_t Pin_LATCH, GPIO_TypeDef * GPIOy)
{
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.
Помогите найти ошибкуи решить задачу