|
|
  |
STM32L100 + HTS221 |
|
|
|
Jun 26 2015, 07:14
|
Участник

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

|
Цитата(Obam @ Jun 26 2015, 07:05)  "но у меня выставлен формат данных 8, и вроде он должен отправлять и принимать по 8 импульсов, но на Во-первых, кто он? ОН контроллер)) ко е что прояснилось, но вопросы с чтением по падению или возрастанию в линии тактирования открыты
Сообщение отредактировал IgorKossak - Jun 26 2015, 17:04
Причина редактирования: бездумное цитирование
|
|
|
|
|
Jun 26 2015, 07:29
|
Участник

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

|
Цитата(Obam @ Jun 26 2015, 07:13)  Данные у вас меняются по заднему фронту SCL, фиксируются по переднему фронту. Всё нормально. Похоже и правда все норм)) от того страннее что ничего не работает)) Цитата(Obam @ Jun 26 2015, 07:17)  Биты CPOL, CPHA в настройках SPI этот вопрос снят, вроде и впрямь и так все правильно работает зато вот какая странность Это нормально? я думал что мое сообщение должно идти первым а не вторым?
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 26 2015, 07:33
|
Участник

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

|
сейчас сделаю)) посмотрим что будет
Сообщение отредактировал IgorKossak - Jun 26 2015, 17:04
Причина редактирования: бездумное цитирование
|
|
|
|
|
Jun 26 2015, 08:00
|
Участник

Группа: Участник
Сообщений: 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); Сейчас юзаю такой код, чисто отсылаю и не опрашиваю
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 26 2015, 08:13
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 26 2015, 08:22
|

Знающий
   
Группа: Участник
Сообщений: 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 чем будете?
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 26 2015, 08:30
|
Участник

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

|
Цитата(Obam @ Jun 26 2015, 08:22)  "Вот хоть убейте…" " SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b; "
Из солёного огурца пристрелить разве что…
Да ё-ж-моё!!! 8-битный интерфейс!!! Читать после 0x8F в ваших 0x8F00 чем будете? ну хоть на осцилографе правильную картинку увидел)) подскажите как правильно сдвинуть сообщение на первые 8 бит?
|
|
|
|
|
Jun 26 2015, 09:24
|
Участник

Группа: Участник
Сообщений: 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); */
}
получил
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 26 2015, 09:30
|
Участник

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

|
Цитата(Obam @ Jun 26 2015, 09:25)  на прием не 16, на прием он их генерит пока задержка не кончится, а надо ровно 8? больше нельзя?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|