|
|
  |
STM32L100 + HTS221 |
|
|
|
Jun 26 2015, 09:35
|

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

|
Цитата(BooSooV @ Jun 26 2015, 13:30)  на прием не 16, на прием он их генерит пока задержка не кончится, а надо ровно 8? больше нельзя? Вам можно!!! Данные 8-разрядные, детский сад - штаны на лямках! Убирайте задержки.
Сообщение отредактировал Obam - Jun 26 2015, 09:36
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 26 2015, 10:01
|
Участник

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

|
убрал, сигналы наложились, в линии тактирования 8 тактов, а в канале данных теже такты только раз в 5 меньше по вольтажу
Сообщение отредактировал IgorKossak - Jun 26 2015, 17:09
Причина редактирования: бездумное цитирование
|
|
|
|
|
Jun 26 2015, 10:19
|
Участник

Группа: Участник
Сообщений: 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
Причина редактирования: бездумное цитирование
|
|
|
|
|
Jun 26 2015, 10:40
|

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

|
По моему, экспериментов - достаточно; настал момент ещё раз, но медленно и внимательно, прочитать RM0038 (понятно о чём я?) стр.741-767. Там есть чудесные диаграммы как ведут себя флаги в SPI_SR.
Сообщение отредактировал IgorKossak - Jun 26 2015, 17:09
Причина редактирования: бездумное цитирование
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jul 13 2015, 06:58
|
Участник

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 15 2015, 05:22
|
Участник

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

|
да хоть так хоть так, все равно ничего не отвечает
|
|
|
|
|
Jul 15 2015, 06:39
|
Участник

Группа: Участник
Сообщений: 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); и осцилограммы И вот вопрос, почему тут вся передача проходит норм а с датчиком нет?
Эскизы прикрепленных изображений
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|