реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> MSP430 + AD5422
_Toxa_
сообщение Oct 12 2010, 18:33
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 16-08-07
Пользователь №: 29 832



Господа знатоки, просьба поделиться опытом, если кто навешивал AD5422 на MSPшку.
Ситуация тривиальная - 249й контроллер, по SPI на него навешана flash (напрямую) и 4 AD5422 (через мультиплексоры и ADuMки)
Все по пдфнику на ЦАП делаю - значения на выходе не хочет выставлять.

Схемы прилагаю (48ая нога контроллера проброшена на 3ю DA2 вручную - упустил из виду при составлении схемы)


Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 12 2010, 21:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



У вас во время работы выбран только один из каналов мультиплексора, а на остальных выходах у него плавающие уровни болтаются. Нужно было хотя бы сигналы SPI_Latchx после муксеров обвешать pull-up резисторами. Другого криминала вроде не вижу. Тестовый исходник, который якобы не работает, давайте.
А вообще мультиплексоры по-моему тут лишние. У ADuM1401 есть вход VE1, который переводит выходы VOD в Z-состояние. Нужно все MOSI, MISO, SCLK на ADuMах запареллелить. Адресные сигналы завести на VE1. На изолированной стороне ADuMов наверное pull-up потребуются, хотя бы на каждый вход LATCH у ЦАП их присопливить. Хотя ... поштудировать даташит ADuMов надо.

Update. Не-а, не понадобятся pull-up-ы на стороне ЦАПов. Только Latch-и тоже растащить придется. Если их на один порт подключите, то можно даже параллельную загрузку ЦАПов организовать. wink.gif Так что выкидывайте ваши мультиплексоры, разведя адресные сигналы на VE1.

Сообщение отредактировал rezident - Oct 12 2010, 21:51
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
_Toxa_
сообщение Oct 13 2010, 15:23
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 16-08-07
Пользователь №: 29 832



тестовая прога вот:

инициализация spi

Код
// SPI initialization for DAC
void SPI_Init_(void)
{    
  P5DIR |= 1<< 4;
//  P5DIR |= 1<< 0;
  deselect();
    
  UCB1CTL1 |= UCSWRST;
  
  UCB1CTL0  = 0x00;
  UCB1CTL0 |= UCMST;                  // master mode
  UCB1CTL0 |= UCSYNC;                 // synchronous mode
  UCB1CTL0 |= UCMSB;                  // MSB first
//  UCB1CTL0 |= UCCKPL;                 // The inactive state is high
  
  
  UCB1CTL1 = 0x41;                    // ACLK, hold UCSWRST
  
  UCB1BR0 = (byte)(QZ / 2 / FREQDAC);        // set frequency
  UCB1BR1 = (QZ / 2 / FREQDAC) >> 8;  
  
  P5SEL |= 1 << 1; // MOSI
  P5SEL |= 1 << 2; // MISO
  P5SEL |= 1 << 3; // SCK

  
  UCB1CTL1 &= ~UCSWRST;                 // **Initialize USCI state machine**
    
  UC1IE  &= ~UCB1RXIE;                  // Enable USCI_B1 RX interrupt
  UC1IE  &= ~UCB1TXIE;            // Disable USCI_B1 TX interrupt

}


функция отправки по spi
Код
void SPI_Send(uchar b)
{
  UC1IFG |= UCB1TXIFG;
    UCB1TXBUF = b;

      while (((UC1IFG&UCB1TXIFG)>>3)==0);    
       Delay_ms(1);

       SPI_WaitForComplete;
    wdgRst();
}


Обращение к ЦАПу в основном цикле
Код
// test DAC

  SPI_Init_();
  Delay_ms(2);

// enable muxes
P3DIR |= 1;P3OUT &= ~1;
// mux addr 0 - DAC #1
P2DIR |= (1 << 1);P2OUT &= ~(1 << 1);
P2DIR |= (1 << 2);P2OUT &= ~(1 << 2);
        
        
//  // set control
    LATCH_HIGH;
    SPI_Send(0x55);//01010101 - control register addr
    SPI_Send(0x10);
    LATCH_LOW;
    SPI_Send(0x01);
    LATCH_HIGH;
    
    Delay_ms(10);    
    SPI_Send(0x01);//00000001 - data register addr
    SPI_Send(0x88);
    LATCH_LOW;
    SPI_Send(0x00);
    LATCH_HIGH;    
//


дефайны
Код
#define desFLASH    {P5OUT |=   1<< 0;}      
#define selFLASH    {P5OUT &= ~(1<< 0);}


#define select()    selFLASH
#define deselect()  desFLASH

#define  SPIspeed               BAUD_UART1
#define  BAUD_UART1             9600L
#define  SPI_notready()     (UCB1STAT & UCBBUSY)
#define  SPI_WaitForComplete      while ( SPI_notready() == 1);

#define LATCH_LOW   {P5DIR |= 1<<4;P5OUT &= ~(1<<4);}
#define LATCH_HIGH  {P5DIR |= 1<<4;P5OUT |=  (1<<4);}


Насчет замечаний по схемотехнике - согласен, но даже при такой хромой реализации выбранный на муксе ЦАП работать должен (при корректном софте, разумеется)???
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 13 2010, 16:34
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Функция SPI_Send как-то странно у вас задумана и реализована. Не осиливаю ее смысл. Можете пояснить функцию каждого оператора?
1. Зачем устанавливать флаг UCB1TXIFG перед записью в буфер? Его вообще-то проверять перед записью нужно, чтобы убедится в готовности буфера. Или вы используете прерывания USCI? Но тогда для чего следующий цикл ожидания? И где обработчик прерывания?
2. Для чего предназначен вот этот while (((UC1IFG&UCB1TXIFG)>>3)==0); цикл ожидания? Я бы еще понял, если бы проверялся флаг готовности приемника. Но флаг готовности передатчика сообщает лишь о том, что готов буфер передатчика. Но он вовсе не означает, что передача/транзакция уже завершилась. К тому же зачем нужен сдвиг вправо при проверке условия в этом цикле, если сравнение с нулем и перед сравнением наложена битовая маска? Не осиливаю такую логику cranky.gif
3. Что делает функция SPI_WaitForComplete? Ожидает окончания занятости? Но флаг UCBBUSY сбрасывается, когда в линию выдается последний бит данных и транзакция еще не завершена. Конец транзакции нужно отслеживать по готовности буфера приемника, проверяя установку флага UCB1RXIFG. И не забывать сбрасывать его (флаг) программно перед началом передачи байта.
4. wdgRst(); это сброс WDT? Зачем он здесь и почему именно здесь? Вообще пока отключите WDT и не включайте до тех пор, пока не отладите всю программу без него!
Go to the top of the page
 
+Quote Post
_Toxa_
сообщение Oct 13 2010, 16:54
Сообщение #5





Группа: Новичок
Сообщений: 6
Регистрация: 16-08-07
Пользователь №: 29 832



spi_send рабочая, т.к. обмен данными с флеш-памятью (см. схему) проходит без проблем.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 13 2010, 17:17
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Dataflash обычно использует SPI mode 3, а этот ЦАП, судя по временным диаграммам - SPI mode 0. У вас же в программе задается SPI mode 2. Для задания правильного режима биты должны быть UCCKPH=1, UCCKPL=0.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
_Toxa_
сообщение Oct 13 2010, 19:18
Сообщение #7





Группа: Новичок
Сообщений: 6
Регистрация: 16-08-07
Пользователь №: 29 832



поставил UCCKPH=1 - не идет.
Скорость обмена с цапом 9600 бит/c, осциллографом тыкался - данные по линии SPI появляются, но результата на аналоговом выходе нет.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 13 2010, 20:11
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Создайте новый проект. Напишите простую тестовую программу, которая будет общаться только с одним выбранным ЦАП. WDT остановите и не трогайте его. Если опять не заработает, то давайте исходник этой программы сюда. По предыдущим "ошметкам" исходника понять, где именно у вас "затык", что-то не получается. laughing.gif
Go to the top of the page
 
+Quote Post
_Toxa_
сообщение Oct 22 2010, 04:48
Сообщение #9





Группа: Новичок
Сообщений: 6
Регистрация: 16-08-07
Пользователь №: 29 832



После недолгих мучений выяснилось, что проблема была все таки в схеме.
ADuMку надо запитывать с обеих сторон развзязки, я почему то упустил это из виду.
Кроме того у dc-dcшки AM2D есть два варианта исполнения выходных ножек: выходное напряжение на 4ой и 6ой ногах (для изоляции в 1000В) и выходное напряжение на 5ой и 7ой ногах (для изоляции в 3000 и более В)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 23:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016