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

 
 
> STM32_SPI_AD7794, Принимаю из АЦП подряд 3 байта, они абсолютно одинаковые.
nx6310
сообщение Jul 7 2010, 04:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174



Связь STM32 c АЦП AD7794 через SPI. Использую стандартные библиотеки от производителя.Прога на Atomic TrueStudio (аналог Eclipse ). Для чтения из АЦП 24 битных данных использую псоледовательно прием 3 байтов. При этом они получаются абсолютно одинаковыми по значению. Кто нибудь сталкивался с этим?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
nx6310
сообщение Jul 8 2010, 02:38
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174



Вот код. АЦП в режиме постоянного преобразования.
Код
     while (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)!=0){}
        // SPI_I2S_SendData(SPI2, 0b01011000);
    //GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);
// while (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8)!=0){}    //проверка окончания преобразования
  //GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);
         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
      ADCL = SPI_I2S_ReceiveData(SPI2);
     // while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==RESET){}
      //Delay(0x6ffff);
       ADCM = SPI_I2S_ReceiveData(SPI2);
     // while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==0){}
        //  Delay(0x6ffff);
       ADCH = SPI_I2S_ReceiveData(SPI2);
     // while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==0){}
      //GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);
      ADC_Data=ADCH*0x10000+ADCM*0x100+ADCL;

Ниже стандартные библиотечные функции обмена по SPI
Код
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_SPI_ALL_PERIPH(SPIx));
  
  /* Write in the DR register the data to be sent */
  SPIx->DR = Data;
}

/**
  * @brief  Returns the most recent received data by the SPIx/I2Sx peripheral.
  * @param  SPIx: where x can be
  *   - 1, 2 or 3 in SPI mode
  *   - 2 or 3 in I2S mode
  * @retval The value of the received data.
  */
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx)
{
  /* Check the parameters */
  assert_param(IS_SPI_ALL_PERIPH(SPIx));
  /* Return the data in the DR register */
  return SPIx->DR;
}
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2010, 07:22
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(nx6310 @ Jul 8 2010, 08:38) *
Код
     while (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)!=0){}
         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
      ADCL = SPI_I2S_ReceiveData(SPI2);
       ADCM = SPI_I2S_ReceiveData(SPI2);
       ADCH = SPI_I2S_ReceiveData(SPI2);
      ADC_Data=ADCH*0x10000+ADCM*0x100+ADCL;


Мда... Повторяю свою первую реплику:

Цитата(AHTOXA @ Jul 7 2010, 16:59) *
Чтобы прочитать байт из SPI, надо записать туда какой-либо байт. Вы это учли?


Где запись перед чтением?

Код
    SPI_I2S_SendData(SPI2, 0);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    ADCL = SPI_I2S_ReceiveData(SPI2);

    SPI_I2S_SendData(SPI2, 0);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    ADCM = SPI_I2S_ReceiveData(SPI2);

    SPI_I2S_SendData(SPI2, 0);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    ADCH = SPI_I2S_ReceiveData(SPI2);


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 9 2010, 17:50
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Да. Стандартная наколка spi-нубов:-)
Чем SPI хорош - это просто тупейший сдвиговй регистр как у мастера так и у слейва, соединённые в кольцо.
И для произведения обмена этими регистрами (по сути ни чтения ни записи отдельно не существует) нужны тактовые имульсы в размере N-штук, где N-разрядность регистра.
Ну и конечно же нужно выбрать того слейва с кем хочется пообщаться - для этого используют столько линии #CS сколько есть слейвов.
Вот и вся премудрость:-)

ИМХО SPI - самый примитивный интерфейс вообще.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- nx6310   STM32_SPI_AD7794   Jul 7 2010, 04:19
- - AHTOXA   Чтобы прочитать байт из SPI, надо записать туда ка...   Jul 7 2010, 10:59
- - nx6310   Я пользуюсь стандартной библиотечной функцией. АЦП...   Jul 7 2010, 11:08
|- - AHTOXA   Давайте код, посмотрим.   Jul 7 2010, 12:04
- - nx6310   А как переключать каналы в АЦП. Я выбираю канал, п...   Jul 12 2010, 03:04
|- - demiurg_spb   Вы datasheet вообще-то открывали? Уж больно странн...   Jul 12 2010, 11:03
- - nx6310   Даташит читал. Сначала иницилизирую АЦП. Включаю б...   Jul 12 2010, 11:28
|- - AHTOXA   Цитата(nx6310 @ Jul 12 2010, 17:28) Код w...   Jul 12 2010, 16:53
- - nx6310   Она в нутри функции SPI_I2S_ReceiveData(SPI2) в би...   Jul 12 2010, 18:05
|- - AHTOXA   Цитата(nx6310 @ Jul 13 2010, 00:05) Она в...   Jul 12 2010, 18:50
- - nx6310   функцию GPIO_ReadInputDataBit() поменял. Длительно...   Jul 13 2010, 04:23
|- - AHTOXA   Цитата(nx6310 @ Jul 13 2010, 10:23) функц...   Jul 13 2010, 08:30
- - nx6310   Косяк был всё таки в SPI. Я думал что библиотечные...   Jul 20 2010, 04:52


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:54
Рейтинг@Mail.ru


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