Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32L100 + HTS221
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
Obam
Цитата(BooSooV @ Jun 26 2015, 11:29) *
Похоже и правда все норм))
от того страннее что ничего не работает))



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


Какой смысл вашего сообщения? Запись в датчик по адресу 0x00? При том что: Reserved - 0x00..0x0E - Do not modify.
BooSooV
Цитата(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);
Сейчас юзаю такой код, чисто отсылаю и не опрашиваю
Obam
Это одна команда SPI2->DR = 0x8F?
Вот что хотите делайте, но на диаграмме 16-битовый обмен: 0x008F.

"Сейчас юзаю такой код, чисто отсылаю и не опрашиваю "
Нельзя так делать: цикл шины датчика должен быть завершённым; впрочем так и есть - запись по адресу 0x00 числа 0x8F что запрещено. Изнасилованный HTS221 crying.gif
BooSooV
Цитата(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 бит
Obam
"Вот хоть убейте…"
" SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b; "

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

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


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

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



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

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

Ни фига не правильную! А "сообщение" не двигать, а SPI 8-битный должен быть.
BooSooV
Цитата(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);
*/

}


получил
Obam
http://electronix.ru/forum/index.php?showt...t&p=1347675

На приём почему 16бит?
BooSooV
Цитата(Obam @ Jun 26 2015, 09:25) *
http://electronix.ru/forum/index.php?showt...t&p=1347675

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

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

Вам можно!!!

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

Убирайте задержки.
BooSooV
убрал, сигналы наложились, в линии тактирования 8 тактов, а в канале данных теже такты только раз в 5 меньше по вольтажу
Obam
Не " наложились" а придвинулись; если датчика нет то просто наводка синхроимпульсов на вход.
BooSooV
да они так придвинулись что осталось всего 8 синхроимпульсов)), и на передачу и на прием
а вот эта строка
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {}
почему то не дает достаточных задержек( заходит 3 раза и пролетает дальше, мерил)


ведь импульсов то должно быть все равно 16
Obam
По моему, экспериментов - достаточно; настал момент ещё раз, но медленно и внимательно, прочитать RM0038 (понятно о чём я?) стр.741-767.
Там есть чудесные диаграммы как ведут себя флаги в SPI_SR.
IgorKossak
Obam, BooSooV, перечитайте ещё раз правила, особенно п. 3.4
Мне уже надоело править Ваши посты и надеяться, что Вы заметите мои комментарии.
Ещё раз замечу бездумное цитирование - забаню обоих на две недели.
Модератор.
BooSooV
После долгих мучений перешел на вот такой код
инициализации:
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
Obam
Не 0xBC, а 0x8F ! Число 0xBC дожно быть возвращено датчиком.
BooSooV
да хоть так хоть так, все равно ничего не отвечает
BooSooV
делал обмен по такому же интерфейсу(по одному проводу данных) на одной плате, и получилось, все работает вот код:
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);


и осцилограммы
И вот вопрос, почему тут вся передача проходит норм а с датчиком нет?
Obam
Цитата(BooSooV @ Jul 15 2015, 09:22) *
да хоть так хоть так, все равно ничего не отвечает


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

У кого нибудь вообще есть положительный опыт использования этого датчика в режиме SPI?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.