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

 
 
> STM32L100 + HTS221
BooSooV
сообщение Jun 11 2015, 05:52
Сообщение #1


Участник
*

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



Здравствуйте, есть проблема, надо подключить HTS221(датчик температуры и влажности) к STM32L100.
Схема соеденения:
HTS221 SCL --------- PB13(SCK2) STM32L100
................RDY---------PC6(RDY2)
................SDA---------PB15(MOSI2)
................CS------------PB12(CS2)
Схема соединения изменению не подлежит.
Инициализация SPI 2:
CODE
#define GPIO_Pin_NSS2 GPIO_Pin_12 // NSS (CS)
#define GPIO_Pin_SCK2 GPIO_Pin_13 // SCK
#define GPIO_Pin_MISO2 GPIO_Pin_14 // MISO
#define GPIO_Pin_MOSI2 GPIO_Pin_15 // MOSI
#define GPIOSPI2 GPIOB

#define GPIO_PinSourceSCK2 GPIO_PinSource13
#define GPIO_PinSourceMISO2 GPIO_PinSource14
#define GPIO_PinSourceMOSI2 GPIO_PinSource15

// -- Инициализация GPIO для SPI2 ----------------------------------------------
void init_GPIO_for_SPI2()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure2;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // Запуск необходимых GPIO

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_SCK2 | GPIO_Pin_MISO2 | GPIO_Pin_MOSI2;
GPIO_Init(GPIOSPI2, &GPIO_InitStructure);

// нога NSS(CS2). она управляется программно, ПОЭТОМУ
// она конфигурируется как выход
GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure2.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure2.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_NSS2;
GPIO_Init(GPIOSPI2, &GPIO_InitStructure2);

// Настраиваем ноги SPI2 для работы в режиме альтернативной функции
GPIO_PinAFConfig(GPIOSPI2, GPIO_PinSourceSCK2, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOSPI2, GPIO_PinSourceMISO2, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOSPI2, GPIO_PinSourceMOSI2, GPIO_AF_SPI2);

GPIO_SetBits(GPIOSPI2, GPIO_Pin_NSS2);
}


// -- Инициализация SPI2 -------------------------------------------------------
void Init_SPI2()
{
SPI_InitTypeDef SPI_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

SPI_Cmd(SPI2, DISABLE);
SPI_I2S_DeInit(SPI2);

init_GPIO_for_SPI2();

// Настройки SPI2
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_CRCPolynomial=7;

SPI_Init(SPI2,&SPI_InitStructure);

SPI_Cmd(SPI2,ENABLE);

GPIO_SetBits(GPIOSPI2, GPIO_Pin_NSS2);
}

Чтение регистра датчика:
Код
  uint8_t cmd = 0x4F;

   while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
   GPIO_ResetBits(GPIOSPI2, GPIO_Pin_NSS2);

   while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}
   SPI_I2S_SendData(SPI2, cmd);  

   while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {}
   uint8_t data = SPI_I2S_ReceiveData(SPI2);
  
   while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}
   SPI_I2S_SendData(SPI2, 0x00);

   while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {}
   data = SPI_I2S_ReceiveData(SPI2);

   GPIO_SetBits(GPIOSPI2, GPIO_Pin_NSS2);

по идее должен выдать свое имя
Такая схема у меня работала на другом SPI но там было MOSI И MISO разными проводами, а тут все в одном, что делать не знаю пробовал поставить в инициализации SPI_Direction_1Line_Tx, но тогда мы не можем считать, а насколько я понимаю мы должны сначала прислать адрес ячейки а потом считать инфу, и все по одному проводу. Объясните пожалуйста что не так, и как заставить работать.

Сообщение отредактировал IgorKossak - Jun 11 2015, 05:59
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
5 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 71)
SasaVitebsk
сообщение Jun 11 2015, 06:06
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А SDA не наводит на мысль что интерфейс I2C? И как он соотносится с SPI?
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 11 2015, 06:12
Сообщение #3


Участник
*

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



Цитата(SasaVitebsk @ Jun 11 2015, 06:06) *
А SDA не наводит на мысль что интерфейс I2C? И как он соотносится с SPI?

SDA/SDI/SDO это одна ножка датчика,
а ножкой CS мы определяем будем общаться по SPI или I2C
сори за не точнсть, так на схеме написано что мне дали
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 11 2015, 06:23
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 11 2015, 09:52) *
Здравствуйте, есть проблема, надо подключить HTS221(датчик температуры и влажности) к STM32L100.
Схема соеденения:
HTS221 SCL --------- PB13(SCK2) STM32L100
................RDY---------PC6(RDY2)
................SDA---------PB15(MOSI2)
................CS------------PB12(CS2)
Схема соединения изменению не подлежит.


SPI у датчика "не SPI". Схема соединения подлежит не изменению, а доработке: вывод MOSI2 соединить с MISO2.
Тогда после отправки первого байта, программно придется переключать MOSI2 в режим GP_I и принимать байт ответа по MISO2.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jun 11 2015, 06:24
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Таки читайте внимательней рефренс-мануал на STM32L100, особенно раздел 28.3.4 Configuring the SPI for half-duplex communication sm.gif
И не слушайте Обаму - схему менять не надо sm.gif
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 11 2015, 06:27
Сообщение #6


Участник
*

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



Цитата(RabidRabbit @ Jun 11 2015, 06:24) *
Таки читайте внимательней рефренс-мануал на STM32L100, особенно раздел 28.3.4 Configuring the SPI for half-duplex communication sm.gif
И не слушайте Обаму - схему менять не надо sm.gif

спасибо, сейчас гляну
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 11 2015, 06:45
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Если есть half-duplex, то не слушайте, а если нет, то…

Кстати, ST всех вводят в заблуждение: этот интерфейс назывался 2Wire.



--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 11 2015, 07:14
Сообщение #8


Участник
*

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



прочитал 28.3.4 Configuring the SPI for half-duplex communication
поискал в системных файлах халф дуплекс но нашел только такие конфигурации:
файл stm32l1xx_spi.h
CODE
/** @defgroup SPI_data_direction
* @{
*/

#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000)
#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400)
#define SPI_Direction_1Line_Rx ((uint16_t)0x8000)
#define SPI_Direction_1Line_Tx ((uint16_t)0xC000)
#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \
((MODE) == SPI_Direction_2Lines_RxOnly) || \
((MODE) == SPI_Direction_1Line_Rx) || \
((MODE) == SPI_Direction_1Line_Tx))
/**

у меня не полу дуплекса или я что то не понял?

нашел ещё один сомнительный момент в коде
CODE
/******************* Bit definition for SPI_CR1 register ********************/
#define SPI_CR1_CPHA ((uint16_t)0x0001) /*!< Clock Phase */
#define SPI_CR1_CPOL ((uint16_t)0x0002) /*!< Clock Polarity */
#define SPI_CR1_MSTR ((uint16_t)0x0004) /*!< Master Selection */

#define SPI_CR1_BR ((uint16_t)0x0038) /*!< BR[2:0] bits (Baud Rate Control) */
#define SPI_CR1_BR_0 ((uint16_t)0x0008) /*!< Bit 0 */
#define SPI_CR1_BR_1 ((uint16_t)0x0010) /*!< Bit 1 */
#define SPI_CR1_BR_2 ((uint16_t)0x0020) /*!< Bit 2 */

#define SPI_CR1_SPE ((uint16_t)0x0040) /*!< SPI Enable */
#define SPI_CR1_LSBFIRST ((uint16_t)0x0080) /*!< Frame Format */
#define SPI_CR1_SSI ((uint16_t)0x0100) /*!< Internal slave select */
#define SPI_CR1_SSM ((uint16_t)0x0200) /*!< Software slave management */
#define SPI_CR1_RXONLY ((uint16_t)0x0400) /*!< Receive only */
#define SPI_CR1_DFF ((uint16_t)0x0800) /*!< Data Frame Format */
#define SPI_CR1_CRCNEXT ((uint16_t)0x1000) /*!< Transmit CRC next */
#define SPI_CR1_CRCEN ((uint16_t)0x2000) /*!< Hardware CRC calculation enable */
#define SPI_CR1_BIDIOE ((uint16_t)0x4000) /*!< Output enable in bidirectional mode */
#define SPI_CR1_BIDIMODE ((uint16_t)0x8000) /*!< Bidirectional data mode enable */

/******************* Bit definition for SPI_CR2 register ********************/
#define SPI_CR2_RXDMAEN ((uint8_t)0x01) /*!< Rx Buffer DMA Enable */
#define SPI_CR2_TXDMAEN ((uint8_t)0x02) /*!< Tx Buffer DMA Enable */
#define SPI_CR2_SSOE ((uint8_t)0x04) /*!< SS Output Enable */
#define SPI_CR2_FRF ((uint8_t)0x08) /*!< Frame format */
#define SPI_CR2_ERRIE ((uint8_t)0x20) /*!< Error Interrupt Enable */
#define SPI_CR2_RXNEIE ((uint8_t)0x40) /*!< RX buffer Not Empty Interrupt Enable */
#define SPI_CR2_TXEIE ((uint8_t)0x80) /*!< Tx buffer Empty Interrupt Enable */



#define SPI_CR1_BIDIMODE ((uint16_t)0x8000) /*!< Bidirectional data mode enable */
в даташите написано 1 clock and 1 bidirectional data wire (BIDIMODE=1)
а на SPI2 нету BIDIMODE, только на SPI1 значит ли это что на SPI2 нуту полу дуплекса?

Полу дуплекса двунаправленного мне именно двунаправленность на одном проводе нужна
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jun 11 2015, 07:24
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



SPI_CR1_BIDIMODE - CR1 - это номер регистра, а не номер модуля SPI.

Делее про полудуплекс. Вся соль в частичке "полу" sm.gif То есть низзя одновременно передавать и принимать. Если Вы внимательно рассмотрите протокол SPI для датчика HTS221, то увидите, что мастер в начале обмена всегда передаёт один байт, а далее уже по обстоятельствам - либо передаёт, либо принимает, за направление овечает бит SPI_CR1_BIDIOE.

Ещё раз повторю: читайте документацию, там всё написано sm.gif
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 11 2015, 07:41
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(RabidRabbit @ Jun 11 2015, 11:24) *
SPI_CR1_BIDIMODE - CR1 - это номер регистра, а не номер модуля SPI.

Делее про полудуплекс. Вся соль в частичке "полу" sm.gif То есть низзя одновременно передавать и принимать. Если Вы внимательно рассмотрите протокол SPI для датчика HTS221, то увидите, что мастер в начале обмена всегда передаёт один байт, а далее уже по обстоятельствам - либо передаёт, либо принимает, за направление овечает бит SPI_CR1_BIDIOE.

Ещё раз повторю: читайте документацию, там всё написано sm.gif


"…The transfer direction (Input/Output) is selected by the BIDIOE bit in the
SPI_CR1 register. When this bit is 1, the data line is output otherwise it is input…"
Так что я был не далёк от истины, предлагая переводить MOSI во GP-вход у дуплексного SPI. sm.gif


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 11 2015, 08:12
Сообщение #11


Участник
*

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



уважаемые электроники, я так и не понял что мне надо сделать чтобы все заработало, надо:
установить бит BIDIOE = 1
отправить байт адреса откуда я хочу считать
установить бит BIDIOE = 0
считать байт от датчика
у меня правильный ход мыслей? или я опять запутался?
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 11 2015, 08:23
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 11 2015, 12:12) *
уважаемые электроники, я так и не понял что мне надо сделать чтобы все заработало, надо:
установить бит BIDIOE = 1
отправить байт адреса откуда я хочу считать
установить бит BIDIOE = 0
считать байт от датчика
у меня правильный ход мыслей? или я опять запутался?


Да


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 11 2015, 08:36
Сообщение #13


Участник
*

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



Цитата(Obam @ Jun 11 2015, 08:23) *
Да

спасибо, буду пробовать, потом отпишусь о успехах
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 05:57
Сообщение #14


Участник
*

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



Здравствуйте, я опять с вопросами, написал код который худо бедно передает по одному проводу данные, от мастера слейву и обратно, правда передает только один раз а не в цикле, где то накосячил.
Теперь я применил этот код к моему датчику температуры HTS221, но не получил ничего от него, прошу вашей помощи в поиске ошибок

//Инициализация GPIO
CODE
void gpio_init()
{
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; //Тактирование портов A, B


//Линии SPI2 (Master)
//PB15(MOSI), PB14(MISO), PB13(SCK), PB12(NSS) - AF, Push-Pull, AF5(SPI1)
GPIOB->MODER |= GPIO_MODER_MODER15_1 | GPIO_MODER_MODER14_1 | GPIO_MODER_MODER13_1 | GPIO_MODER_MODER12_1; //Alternate function
GPIOB->OTYPER &= ~(GPIO_OTYPER_OT_15 | GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_13 | GPIO_OTYPER_OT_11); //Push-Pull
GPIOB->AFR[1] |= (5<<28 | 5<<24 | 5<<20 | 5<<16); //PB15, PB14, P13, PB12 = AF5



// настройка ноги управления
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD, ENABLE); // Запуск необходимых GPIO


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB, GPIO_Pin_12);



}


//Инициализация SPI2
CODE
void spi_init()
{
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
SPI2->CR1 |= SPI_CR1_BR; //Baud rate = Fpclk/256
SPI2->CR1 &= ~SPI_CR1_CPOL; //Полярность тактового сигнала
SPI2->CR1 &= ~SPI_CR1_CPHA; //Фаза тактового сигнала
SPI2->CR1 &= ~SPI_CR1_DFF; //8 бит данных
SPI2->CR1 &= ~SPI_CR1_LSBFIRST; //MSB передается первым
SPI2->CR1 |= SPI_CR1_SSM; //Программный режим NSS
SPI2->CR1 |= SPI_CR1_SSI; //Аналогично состоянию, когда на входе NSS высокий уровень
SPI2->CR2 |= SPI_CR2_SSOE; //Вывод NSS - выход управления slave select
SPI2->CR1 |= SPI_CR1_MSTR; //Режим Master

SPI2->CR1 |= SPI_CR1_BIDIMODE; // двунаправленный режим по одной шине данных
SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача

SPI2->CR1 |= SPI_CR1_SPE; //Включаем SPI1



}



//Основной цикл программы

// MASTER SPI2
CODE
int main()
{
gpio_init(); //Вызов функции инициализации портов
spi_init(); //Вызов функции инициализации модулей SPI
//GPIOH->BSRRL |= GPIO_BSRR_BS_12; // передача запрещена
GPIO_SetBits(GPIOB, GPIO_Pin_12);//общение запрещено
while(1)
{
//GPIOB->BSRRH |= GPIO_BSRR_BS_12; // начинаем передачу
GPIO_ResetBits(GPIOB, GPIO_Pin_12);//начинаем общние

//передача данных.

SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача
SPI2->DR = 0x4F; //Пишем в буфер передатчика SPI1.
while(!(SPI2->SR & SPI_SR_TXE));// Ожидаем окончания передачи данных
SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача

for(uint32_t i=0; i<0x000FFFFF; i++);
//Прием данных.

SPI2->CR1 &= ~ SPI_CR1_BIDIOE; //BIDIOE прием
while(!(SPI2->SR & SPI_SR_RXNE));//приняли данные
bufPr1 = SPI2->DR;//Считываем данные из приемного буфера SPI1. При этой операции происходит очистка буфера и сброс флага RXNE
SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача




//GPIOB->BSRRL |= GPIO_BSRR_BS_12; // заканчиваем передачу
GPIO_SetBits(GPIOB, GPIO_Pin_12);//общение запрещено

//Временная задержка между вызовами функции обмена данными
for(uint32_t i=0; i<0x000FFFFF; i++);
}
}


Этим кодом я спрашиваю его имя
http://www.farnell.com/datasheets/1836732.pdf
страница 16
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 06:33
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 24 2015, 09:57) *
Здравствуйте,

Здравствуйте sm.gif

Цитата
//передача данных.

SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача
SPI2->DR = 0x4F; //Пишем в буфер передатчика SPI1.
while(!(SPI2->SR & SPI_SR_TXE));// Ожидаем окончания передачи данных
SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача


Точно Spi переведён на приём? Copy-paste погубит мир sm.gif

А вообще, для подобных работ осциллограф наипервейшее средство. Есть?

PS:
Цитата
for(uint32_t i=0; i<0x000FFFFF; i++);
//Прием данных.

SPI2->CR1 &= ~ SPI_CR1_BIDIOE; //BIDIOE прием

Ох, ё-моё, а ведь переведён…

Сообщение отредактировал Obam - Jun 24 2015, 06:41


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 06:42
Сообщение #16


Участник
*

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



Цитата(Obam @ Jun 24 2015, 06:33) *
Здравствуйте sm.gif



Точно Spi переведён на приём? Copy-paste погубит мир sm.gif

А вообще, для подобных работ осциллограф наипервейшее средство. Есть?

Осцилограф есть =) без него бы я вообще ничего не смог, на нем сигнал отправляемым мастером выглядит хорошо,вроде, такт тоже в норме
Копи пастом грешу конечно, но без него и того бы не было, а на прием переводится командой

SPI2->CR1 &= ~ SPI_CR1_BIDIOE; //BIDIOE прием
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 06:44
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 24 2015, 10:42) *
Осцилограф есть =) без него бы я вообще ничего не смог, на нем сигнал отправляемым мастером выглядит хорошо,вроде, такт тоже в норме
Копи пастом грешу конечно, но без него и того бы не было, а на прием переводится командой

SPI2->CR1 &= ~ SPI_CR1_BIDIOE; //BIDIOE прием


Обратно от датчика что?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 06:53
Сообщение #18


Участник
*

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



Цитата(Obam @ Jun 24 2015, 06:44) *
Обратно от датчика что?

ничего, насколько я могу судить, сигналы идут очень быстро и возможно накладываются, а может он просто молчит
в общем ничего интересного от датчика нет
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 07:07
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 24 2015, 10:53) *
ничего, насколько я могу судить, сигналы идут очень быстро и возможно накладываются, а может он просто молчит
в общем ничего интересного от датчика нет


Зациклить обмен с датчиком.
Ждущая развертка, запуск от CS.
На каждый цикл обмена (CS 1-->0 и 1-->0) должно быть 16 синхроимпульсов SCK, на первые 8 - ваши данные (0x4F), на вторые 8 - ответ датчика.

Разворачивайте, смотрите.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 07:25
Сообщение #20


Участник
*

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



Цитата(Obam @ Jun 24 2015, 07:07) *
Зациклить обмен с датчиком.
Ждущая развертка, запуск от CS.
На каждый цикл обмена (CS 1-->0 и 1-->0) должно быть 16 синхроимпульсов SCK, на первые 8 - ваши данные (0x4F), на вторые 8 - ответ датчика.

Разворачивайте, смотрите.

Посмотрел
for(uint32_t i=0; i<0x000000FF; i++);
//Прием данных.
изменил время задержки между приемом и передачей, и когда (CS 1-->0 и 1-->0) у меня там лежит 16 импульсов такта

но зато только сейчас заметил что в канале данных творится дурь, сейчас в пеинте написуюкакая
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 07:26
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 24 2015, 11:25) *
Посмотрел
for(uint32_t i=0; i<0x000000FF; i++);
//Прием данных.
изменил время задержки между приемом и передачей, и когда (CS 1-->0 и 1-->0) у меня там лежит 16 импульсов такта

но зато только сейчас заметил что в канале данных творится дурь, сейчас в пеинте написуюкакая


Очень хорошо; что с данными?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 07:40
Сообщение #22


Участник
*

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



Цитата(Obam @ Jun 24 2015, 07:26) *
Очень хорошо; что с данными?


картинка с плавным падением сигнала


Для проверки канала подал 10101010, вот что увидел осцилограф в канале данных(ровные кубики)

Сообщение отредактировал BooSooV - Jun 24 2015, 07:41
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 07:59
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



"…Мойша The Beatles напел…" sm.gif

Синхроимпульсы как расположены?
0x4F, положим, видно. Плавный спад - разряд входной емкости. Ответ должен быть 0xBC.

10101010 - на фига? Датчик же висит на шине - хрень какая-нибудь загонтся в него…

Ё-моё! 0x4F! Маэстро, вы, не охренели? Запись в регистр для чтения?

Сообщение отредактировал Obam - Jun 24 2015, 07:55


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 08:12
Сообщение #24


Участник
*

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



Цитата(Obam @ Jun 24 2015, 07:59) *
"…Мойша The Beatles напел…" sm.gif

Синхроимпульсы как расположены?
0x4F, положим, видно. Плавный спад - разряд входной емкости. Ответ должен быть 0xBC.

10101010 - на фига? Датчик же висит на шине - хрень какая-нибудь загонтся в него…

Ё-моё! 0x4F! Маэстро, вы, не охренели? Запись в регистр для чтения?

Вот так расположены синхроимпульсы


но но уважаемый =)) никакой записи и в помин нет, если я не ошибаюсь
даташит http://www.farnell.com/datasheets/1836732.pdf (стр 16) гласит:
SPI read
The SPI read command is performed with 16 clock pulses:
bit 0: READ bit. The value is 1.
bit 1: MS bit. When 0, do not increment the address, when 1, increment the address in
multiple readings.
bit 2-7: address AD(5:0). This is the address field of the indexed register.
bit 8-15: data DO(7:0) (read mode). This is the data that is read from the device (MSB first).
Multiple read command is also available in 3-wires mode.

блин вижу свой косяк

Сообщение отредактировал BooSooV - Jun 24 2015, 08:07
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 08:13
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 24 2015, 12:05) *
но но уважаемый =)) никакой записи и в помин нет, если я не ошибаюсь

Да ну?
[attachment=93415:_x7_.png]

0x4F как на картиночке будет расположено?
Тут старая сказка "про белого бычка": бит 0 в байте данных и бит 0 при его передаче. sm.gif


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 08:15
Сообщение #26


Участник
*

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



надо писать 8F == 10001111
1 = читаю
0 = без сдвига
001111 = откуда читаю
Спасибо за указание на ошибку, я один нолик пропустил
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 08:20
Сообщение #27


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Кроме того, если нет записи, по-вашему, 11110010b (0x4F наоборот) по какому адресу читался ID датчика?

Цитата(BooSooV @ Jun 24 2015, 12:15) *
надо писать 8F == 10001111


Что датчик отвечает? Осцилл. старый? Почему сигналограммы в paint?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 08:25
Сообщение #28


Участник
*

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



Цитата(Obam @ Jun 24 2015, 08:20) *
Кроме того, если нет записи, по-вашему, 11110010b (0x4F наоборот) по какому адресу читался ID датчика?



Что датчик отвечает? Осцилл. старый? Почему сигналограммы в paint?

не долгой была моя радость, датчик отвечает FF
Осцилограмма в пеинте потому что способа проще я не нашел, у меня простой осцилограф, старого типа, никакого вывода на комп нету, и вот что он нам показал:
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 08:38
Сообщение #29


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



И из DR читается 0xFF?
Повторяемость результата есть?

Цитата(BooSooV @ Jun 24 2015, 12:25) *
не долгой была моя радость, датчик отвечает FF


Не нравится мне плавный спад: синхроимпульсы в это время есть?
Кстати, фронты синхроимпульсов правильно выбраны?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 08:40
Сообщение #30


Участник
*

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



Цитата(Obam @ Jun 24 2015, 08:32) *
И из DR читается 0xFF?
Повторяемость результата есть?

что за DR?
я ведь должен прислать датчику такое чтобы считать? 10111100 (BC) ?
повторяемость 100% с этим все стабильно))


Синхроимпульсы есть? а как проверить правильно ли выбраны их фронты?
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 08:50
Сообщение #31


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 24 2015, 12:40) *
что за DR?

DataRegister wink.gif
"bufPr1 = SPI2->DR;//Считываем данные из приемного б…"

Цитата
я ведь должен прислать датчику такое чтобы считать? 10111100 (BC) ?

0xBC должен ответить датчик.

Цитата
Синхроимпульсы есть? а как проверить правильно ли выбраны их фронты?


Данные SPI-блоком в контроллере могут двигаться по переднему или по заднему фронту синхроимпульсов.
Вот ответ датчика с правильным ID и будет признаком правильной настройки интерфейса.

Наличие синхроимпульсов во время плавного спада данных не годится.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 24 2015, 09:22
Сообщение #32


Участник
*

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



Пойдем по списку))
смотрел на прямую DR, пишу в него BC (10111100)
1 - чтение
0 - без здвига
111100 - 6 разрядный адрес 0F задом наперед

можно как нибудь решить проблему плавного спада?

Я домой, дальнейшие пытки датчика продолжатся завтра с 9:00 =)

Сообщение отредактировал IgorKossak - Jun 25 2015, 16:12
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 24 2015, 09:54
Сообщение #33


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Стоять!!!!! Назад!!!!!

В DR 0xBC писать не надо. Это датчик во втором байте должен вернуть (т.е. процессор вычитать).
Вот примерно так:
Прикрепленное изображение

По поводу плавного спада: надо разобраться с исходным уровнем и активным фронтом SCK.

Сообщение отредактировал IgorKossak - Jun 25 2015, 16:13
Причина редактирования: бездумное цитирование


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 25 2015, 05:32
Сообщение #34


Участник
*

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



AD5 AD4.....AD0 они ведь идут задом наперед, не надо ли и адрес в бинарном коде писать задом наперед?
Так ведь чтобы что то передать это что то надо записать в DR, оттуда и считать что пришло, разве нет?

Сообщение отредактировал IgorKossak - Jun 25 2015, 16:13
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 25 2015, 07:02
Сообщение #35


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Шутки шутками, но доку (DS на датчик и контроллер и RefMan на контроллер) - курить до просветления.

Данные в датчик должны "вдуваться" старшим (MSB) битом вперёд: R\~Wбит это старший, AD5..AD0 - записаны от старшего к младшему => 10001111b. Зачем это преворачивать?

"Так ведь чтобы что то передать это что то надо записать в DR, оттуда и считать что пришло, разве нет?"
Так вы и писали в DR 0x8F при BIDIOE==1, а как этот байт был отправлен, то BIDIOE 1-->0 переключит SPI на приём и автоматически вычитает (R\~W==1 не забыли?) из датчика
данные по только что переданному адресу, их вы увидите тоже в DR.

И ещё: если не будет выполнено "This line is driven at the falling edge of SCL and should be captured at the rising edge of SCL." то не правильно будут тактироваться данные.
CPOL, CPHA соответствуют требуемому?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 25 2015, 07:36
Сообщение #36


Участник
*

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



увидел только что одну проблему, мой код почему то на отправку генерит 16 импульсов, и ничего не генерит на прием, я думал что это 8 на передачу и 8 на прием, а оказалось что на прием воще ничего нет, сейчас пробую другой пример под себя переделать, об успехах отпишусь

Сообщение отредактировал IgorKossak - Jun 25 2015, 16:14
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 25 2015, 07:49
Сообщение #37


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



CODE

SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача
SPI2->DR = 0x8F; //Пишем в буфер передатчика SPI1.
while(!(SPI2->SR & SPI_SR_TXE));// Ожидаем окончания передачи данных
SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача

for(uint32_t i=0; i<0x000FFFFF; i++);
//Прием данных.

SPI2->CR1 &= ~ SPI_CR1_BIDIOE; //BIDIOE прием
while(!(SPI2->SR & SPI_SR_RXNE));//приняли данные
bufPr1 = SPI2->DR;//Считываем данные из приемного буфера SPI1. При этой операции происходит очистка буфера и сброс флага RXNE
SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача

Ну откуда??? 8 синхроимпульсов от "SPI2->DR = 0x8F" и 8 синхроимпульсов от "SPI2->CR1 &= ~ SPI_CR1_BIDIOE"


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 25 2015, 08:05
Сообщение #38


Участник
*

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



Ну откуда??? 8 синхроимпульсов от "SPI2->DR = 0x8F" и 8 синхроимпульсов от "SPI2->CR1 &= ~ SPI_CR1_BIDIOE"[/quote]
если бы я знал)) я закоментил все, оставил только отправку, а как было 16 импульсов так и осталось

Сообщение отредактировал IgorKossak - Jun 25 2015, 16:14
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 25 2015, 08:35
Сообщение #39


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 25 2015, 12:05) *
если бы я знал)) я закоментил все, оставил только отправку, а как было 16 импульсов так и осталось


• 8- or 16-bit transfer frame format selection



--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 06:35
Сообщение #40


Участник
*

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



Цитата(Obam @ Jun 25 2015, 08:35) *
• 8- or 16-bit transfer frame format selection

но у меня выставлен формат данных 8, и вроде он должен отправлять и принимать по 8 импульсов, но на самом деле как я понял по его работе, он первую половину воспринимает как отправляемое сообщение, а вторую часть как получаемое, короче я воще ничего не понимаю,
запустил код на Дискавери, думал может что разведено не так,а один фиг при некоторых комбинациях вижу плавный спад


Передаю 2A, размер данных 8 бит, прицепил к осцилографу два щупа, и получил вот такое соответствие,
первый такт
второй данные
Такое разве нормально?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 06:48
Сообщение #41


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



А что не так?
[attachment=93482:_x9_.png]
00101010b==0x2A старшим битом вперёд. Всё нормально.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 07:03
Сообщение #42


Участник
*

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



Меня смущает то, что в даташите на датчик, начало импульсов в шине данных совпадает с падением в шине такта, а у нас с подъёмом, это нормально?

Сообщение отредактировал IgorKossak - Jun 26 2015, 17:03
Причина редактирования: бездумное цитирование

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 07:05
Сообщение #43


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



"но у меня выставлен формат данных 8, и вроде он должен отправлять и принимать по 8 импульсов, но на самом деле как я понял по его работе, он первую половину воспринимает как отправляемое сообщение, а вторую часть как получаемое"

Во-первых, кто он?
Во-вторых, первый байт - адрес в датчике, а второй байт - данные (если запись в датчик) или ответ датчика (если чтение из него).

"SPI2->DR = 0x8F" команда, дающая передачу первого байта;
"SPI2->CR1 &= ~ SPI_CR1_BIDIOE" команда, дающая прием второго байта.
Если бы надо было записать данные в датчик, то использовалась бы вторая команда "SPI2->DR = 0x**".


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 07:11
Сообщение #44


Участник
*

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



The first bit (bit 0) starts at the first falling edge of SCL after the falling edge
of CS while the last bit (bit 15, bit 23,...) starts at the last falling edge of SCL just before the
rising edge of CS.
Вот выдержка из даташита, которая говорит тоже самое
Можно как то настроить чтобы он не по возрастанию читал линию данных а по падению
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 07:13
Сообщение #45


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 26 2015, 11:03) *
Меня смущает то, что в даташите на датчик, начало импульсов в шине данных совпадает с падением в шине такта, а у нас с подъёмом, это нормально?


Данные у вас меняются по заднему фронту SCL, фиксируются по переднему фронту. Всё нормально.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 07:14
Сообщение #46


Участник
*

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



Цитата(Obam @ Jun 26 2015, 07:05) *
"но у меня выставлен формат данных 8, и вроде он должен отправлять и принимать по 8 импульсов, но на Во-первых, кто он?

ОН контроллер)) ко е что прояснилось, но вопросы с чтением по падению или возрастанию в линии тактирования открыты

Сообщение отредактировал IgorKossak - Jun 26 2015, 17:04
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 07:17
Сообщение #47


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 26 2015, 11:11) *
The first bit (bit 0) starts at the first falling edge of SCL after the falling edge
of CS while the last bit (bit 15, bit 23,...) starts at the last falling edge of SCL just before the
rising edge of CS.
Вот выдержка из даташита, которая говорит тоже самое
Можно как то настроить чтобы он не по возрастанию читал линию данных а по падению



Биты CPOL, CPHA в настройках SPI


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 07:29
Сообщение #48


Участник
*

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



Цитата(Obam @ Jun 26 2015, 07:13) *
Данные у вас меняются по заднему фронту SCL, фиксируются по переднему фронту. Всё нормально.

Похоже и правда все норм))
от того страннее что ничего не работает))


Цитата(Obam @ Jun 26 2015, 07:17) *
Биты CPOL, CPHA в настройках SPI

этот вопрос снят, вроде и впрямь и так все правильно работает
зато вот какая странность
Это нормально? я думал что мое сообщение должно идти первым а не вторым?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 07:29
Сообщение #49


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Ну что?

SPI2->CR1 |= SPI_CR1_CPOL; //исходное состояние SCK==1
SPI2->CR1 |= SPI_CR1_CPHA; //capture 0-->1
не судьба?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 07:33
Сообщение #50


Участник
*

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



сейчас сделаю)) посмотрим что будет

Сообщение отредактировал IgorKossak - Jun 26 2015, 17:04
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 07:37
Сообщение #51


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 26 2015, 11:29) *
Похоже и правда все норм))
от того страннее что ничего не работает))



этот вопрос снят, вроде и впрямь и так все правильно работает
зато вот какая странность
Это нормально? я думал что мое сообщение должно идти первым а не вторым?


Какой смысл вашего сообщения? Запись в датчик по адресу 0x00? При том что: Reserved - 0x00..0x0E - Do not modify.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 08:00
Сообщение #52


Участник
*

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



Цитата(Obam @ Jun 26 2015, 07:37) *
Какой смысл вашего сообщения? Запись в датчик по адресу 0x00? При том что: Reserved - 0x00..0x0E - Do not modify.

смысл этого сообщения просто привести кубики в соответствие с даташитом, само сообщение смысла не несет,
а вот это уже несет
но можете подсказать как передвинуть сообщение с последних 8 тактов на первые 8, а то пока вот так



while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}

GPIO_ResetBits(GPIOSPI2, GPIO_Pin_NSS2);

SPI_I2S_SendData(SPI2, 0x8F);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

Delay(1);
GPIO_SetBits(GPIOSPI2, GPIO_Pin_NSS2);
Delay(100);
Сейчас юзаю такой код, чисто отсылаю и не опрашиваю
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 08:02
Сообщение #53


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Это одна команда SPI2->DR = 0x8F?
Вот что хотите делайте, но на диаграмме 16-битовый обмен: 0x008F.

"Сейчас юзаю такой код, чисто отсылаю и не опрашиваю "
Нельзя так делать: цикл шины датчика должен быть завершённым; впрочем так и есть - запись по адресу 0x00 числа 0x8F что запрещено. Изнасилованный HTS221 crying.gif

Сообщение отредактировал Obam - Jun 26 2015, 08:09


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 08:13
Сообщение #54


Участник
*

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



Цитата(Obam @ Jun 26 2015, 08:02) *
Это одна команда SPI2->DR = 0x8F?
Вот что хотите делайте, но на диаграмме 16-битовый обмен: 0x008F.

CODE
void Init_SPI2()
{
SPI_InitTypeDef SPI_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

SPI_Cmd(SPI2, DISABLE);
SPI_I2S_DeInit(SPI2);

init_GPIO_for_SPI2();

// Настройки SPI2
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_CRCPolynomial=7;

SPI_Init(SPI2,&SPI_InitStructure);

SPI_Cmd(SPI2,ENABLE);

GPIO_SetBits(GPIOSPI2, GPIO_Pin_NSS2);
}


CODE

SPI2->CR1 |= SPI_CR1_CPOL; //исходное состояние SCK==1
SPI2->CR1 |= SPI_CR1_CPHA; //capture 0-->1
while(1)
{

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
GPIO_ResetBits(GPIOSPI2, GPIO_Pin_NSS2);

//while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}

SPI_I2S_SendData(SPI2, 0x8F);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
/*
SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Rx);

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
uint8_t data = SPI_I2S_ReceiveData(SPI2);
SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);
*/
GPIO_SetBits(GPIOSPI2, GPIO_Pin_NSS2);
Delay(100);
/*
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {}
uint8_t data = SPI_I2S_ReceiveData(SPI2);
*/

}


Вот хоть убейте, ничего больше нету

Заменил отправку на
SPI_I2S_SendData(SPI2, 0x8F00);
теперь сдвинулось на первые 8 бит

Сообщение отредактировал BooSooV - Jun 26 2015, 08:07
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 08:22
Сообщение #55


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



"Вот хоть убейте…"
" SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b; "

Из солёного огурца пристрелить разве что…

Цитата(BooSooV @ Jun 26 2015, 12:13) *
Заменил отправку на
SPI_I2S_SendData(SPI2, 0x8F00);
теперь сдвинулось на первые 8 бит


Да ё-ж-моё!!! 8-битный интерфейс!!! Читать после 0x8F в ваших 0x8F00 чем будете?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 08:30
Сообщение #56


Участник
*

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



Цитата(Obam @ Jun 26 2015, 08:22) *
"Вот хоть убейте…"
" SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b; "

Из солёного огурца пристрелить разве что…



Да ё-ж-моё!!! 8-битный интерфейс!!! Читать после 0x8F в ваших 0x8F00 чем будете?

ну хоть на осцилографе правильную картинку увидел))
подскажите как правильно сдвинуть сообщение на первые 8 бит?
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 08:33
Сообщение #57


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 26 2015, 12:30) *
ну хоть на осцилографе правильную картинку увидел))
подскажите как правильно сдвинуть сообщение на первые 8 бит?

Ни фига не правильную! А "сообщение" не двигать, а SPI 8-битный должен быть.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 09:24
Сообщение #58


Участник
*

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



Цитата(Obam @ Jun 26 2015, 08:33) *
Ни фига не правильную! А "сообщение" не двигать, а SPI 8-битный должен быть.

написал
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
теперь 8 импульсов тактирования

имеем

как же теперь получить ещё 8 тактов на которые должен ответить датчик?

кажется что то понял

во мой код на отправку и получение, пока что без датчика, просто смотрю что генерит контроллер
CODE
while(1)
{

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
GPIO_ResetBits(GPIOSPI2, GPIO_Pin_NSS2);

//while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}

SPI_I2S_SendData(SPI2, 0x8F);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

//Delay(2);
for(uint32_t i=0; i<0x000001FF; i++); // время по подачи импульсов на ответ
SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Rx);

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
uint8_t data = SPI_I2S_ReceiveData(SPI2);
//Delay(2);
for(uint32_t i=0; i<0x000000FF; i++); // подолжительность импульсов на ответ
SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);

GPIO_SetBits(GPIOSPI2, GPIO_Pin_NSS2);
Delay(100);
/*
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {}
uint8_t data = SPI_I2S_ReceiveData(SPI2);
*/

}


получил
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 09:25
Сообщение #59


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



http://electronix.ru/forum/index.php?showt...t&p=1347675

На приём почему 16бит?

Сообщение отредактировал Obam - Jun 26 2015, 09:27


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 09:30
Сообщение #60


Участник
*

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



Цитата(Obam @ Jun 26 2015, 09:25) *
http://electronix.ru/forum/index.php?showt...t&p=1347675

На приём почему 16бит?

на прием не 16, на прием он их генерит пока задержка не кончится, а надо ровно 8? больше нельзя?
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 09:35
Сообщение #61


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jun 26 2015, 13:30) *
на прием не 16, на прием он их генерит пока задержка не кончится, а надо ровно 8? больше нельзя?

Вам можно!!!

Данные 8-разрядные, детский сад - штаны на лямках!

Убирайте задержки.

Сообщение отредактировал Obam - Jun 26 2015, 09:36


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 10:01
Сообщение #62


Участник
*

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



убрал, сигналы наложились, в линии тактирования 8 тактов, а в канале данных теже такты только раз в 5 меньше по вольтажу

Сообщение отредактировал IgorKossak - Jun 26 2015, 17:09
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 10:08
Сообщение #63


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Не " наложились" а придвинулись; если датчика нет то просто наводка синхроимпульсов на вход.

Сообщение отредактировал IgorKossak - Jun 26 2015, 17:10
Причина редактирования: бездумное цитирование


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jun 26 2015, 10:19
Сообщение #64


Участник
*

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



да они так придвинулись что осталось всего 8 синхроимпульсов)), и на передачу и на прием
а вот эта строка
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}
почему то не дает достаточных задержек( заходит 3 раза и пролетает дальше, мерил)


ведь импульсов то должно быть все равно 16

Сообщение отредактировал IgorKossak - Jun 26 2015, 17:10
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 26 2015, 10:40
Сообщение #65


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



По моему, экспериментов - достаточно; настал момент ещё раз, но медленно и внимательно, прочитать RM0038 (понятно о чём я?) стр.741-767.
Там есть чудесные диаграммы как ведут себя флаги в SPI_SR.

Сообщение отредактировал IgorKossak - Jun 26 2015, 17:09
Причина редактирования: бездумное цитирование


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 26 2015, 17:09
Сообщение #66


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Obam, BooSooV, перечитайте ещё раз правила, особенно п. 3.4
Мне уже надоело править Ваши посты и надеяться, что Вы заметите мои комментарии.
Ещё раз замечу бездумное цитирование - забаню обоих на две недели.
Модератор.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jul 13 2015, 06:58
Сообщение #67


Участник
*

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



После долгих мучений перешел на вот такой код
инициализации:
CODE
SPI_InitTypeDef SPI_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

SPI_Cmd(SPI2, DISABLE);
SPI_I2S_DeInit(SPI2);



// Настройки SPI2
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;

SPI_Init(SPI2,&SPI_InitStructure);

SPI_Cmd(SPI2,ENABLE);



Обмен данными:
CODE
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
for(uint32_t i=0; i<0x0000003F; i++);
SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
SPI2->DR = 0xBC;
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
for(uint32_t i=0; i<0x0000003F; i++);

SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Rx);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
for(uint32_t i=0; i<0x0000003F; i++);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {}
uint8_t temp2 = SPI2->DR;
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
for(uint32_t i=0; i<0x0000003F; i++);
SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);
GPIO_SetBits(GPIOB, GPIO_Pin_12);


Датчик молчит.
а вот что на осциллографе:

HEEELP
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 14 2015, 08:26
Сообщение #68


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Не 0xBC, а 0x8F ! Число 0xBC дожно быть возвращено датчиком.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jul 15 2015, 05:22
Сообщение #69


Участник
*

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



да хоть так хоть так, все равно ничего не отвечает
Go to the top of the page
 
+Quote Post
BooSooV
сообщение Jul 15 2015, 06:39
Сообщение #70


Участник
*

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



делал обмен по такому же интерфейсу(по одному проводу данных) на одной плате, и получилось, все работает вот код:
CODE
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}

SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);
SPI_BiDirectionalLineConfig(SPI1,SPI_Direction_Rx);

GPIO_ResetBits(GPIOB, GPIO_Pin_4);

SPI2->DR = 0x07;

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) {}

uint8_t temp1 = SPI1->DR;

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}

////////////////////////////////////////////////////////////////////////////

SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Rx);
SPI_BiDirectionalLineConfig(SPI1,SPI_Direction_Tx);

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}

for(uint32_t i=0; i<0x0000003F; i++);

SPI1->DR = 0x04;

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) {}
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {}

uint8_t temp2 = SPI2->DR;

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}

SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);
SPI_BiDirectionalLineConfig(SPI1,SPI_Direction_Rx);

GPIO_SetBits(GPIOB, GPIO_Pin_4);while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}

SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);
SPI_BiDirectionalLineConfig(SPI1,SPI_Direction_Rx);

GPIO_ResetBits(GPIOB, GPIO_Pin_4);

SPI2->DR = 0x07;

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) {}

uint8_t temp1 = SPI1->DR;

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}

////////////////////////////////////////////////////////////////////////////

SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Rx);
SPI_BiDirectionalLineConfig(SPI1,SPI_Direction_Tx);

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}

for(uint32_t i=0; i<0x0000003F; i++);

SPI1->DR = 0x04;

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) {}
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {}

uint8_t temp2 = SPI2->DR;

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}

SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);
SPI_BiDirectionalLineConfig(SPI1,SPI_Direction_Rx);

GPIO_SetBits(GPIOB, GPIO_Pin_4);


и осцилограммы
И вот вопрос, почему тут вся передача проходит норм а с датчиком нет?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 15 2015, 07:58
Сообщение #71


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(BooSooV @ Jul 15 2015, 09:22) *
да хоть так хоть так, все равно ничего не отвечает


Ну значит хана датчику, "завоспитыван" отладкой кода.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
RoadRunner
сообщение Sep 28 2015, 08:31
Сообщение #72


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 13-05-11
Пользователь №: 64 972



Интересно, чем все закончилось)) А то у меня аналогичные проблемы с этим гребаным датчиком (hts221): передаю ему b"10001111" после чего перевожу линию данных на прием, генерю 8 импульсов SCK и ожидаю на шине данных 0xBC. Вместо этого там плавно нарастающий сигнал, который читается как 0xFF. Плавно нарастающий сигнал - это скорее всего колебания напряжения в третьем состоянии (десятые доли вольта), т.е. датчик просто отсутствует как драйвер, как будто неживой.

У кого нибудь вообще есть положительный опыт использования этого датчика в режиме SPI?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 04:16
Рейтинг@Mail.ru


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