jenya7 0 11 мая, 2018 Опубликовано 11 мая, 2018 (изменено) · Жалоба Есть функции чтения/записи void DRV8308_WriteRegister(uint8_t address, uint16_t data) { //clear bit7 in address address &= 0x7F; CS1_HI; //inverse logic!!! SPI_TransferByte(DRV8308_SPI, address); SPI_TransferByte(DRV8308_SPI, data>>8); SPI_TransferByte(DRV8308_SPI, data&0xFF); CS1_LO; } void DRV8308_ReadRegister(uint8_t address, uint16_t *data) { uint8_t tmp_data[2]={0}; //set bit7 in address address |= 0x80; CS1_HI; //inverse logic!!! SPI_TransferByte(DRV8308_SPI, address); tmp_data[0] = SPI_TransferByte(DRV8308_SPI, 0x00); tmp_data[1] = SPI_TransferByte(DRV8308_SPI, 0x00); CS1_LO; *data = (tmp_data[0] << 8) | tmp_data[1]; } Читаю из регистра 0x2A - дефолтное значение 0x18 - получаю 0x08 Для проверки пишу в регистр 0x07 пишу 0x07 - читаю 0x03 пишу 0x0F - читаю 0x07 пишу 0x09 - читаю 0x00 Подсоеденил логик аналайзер - все сигналы в норме - пин МИСО возвращает правильные значения. Единственно что - на 0x07 и 0x0F последний бит почему то дребезжит.Почему контролер ( STM32F303CB) не читает правильно пин МИСО? Изменено 11 мая, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Почему контролер ( STM32F303CB) не читает правильно пин МИСО? Режим SPI (0, 1, 2, 3) на микроконтроллере правильно настроили? Альтернативную функцию пина включили?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 мая, 2018 Опубликовано 11 мая, 2018 (изменено) · Жалоба Режим SPI (0, 1, 2, 3) на микроконтроллере правильно настроили? Альтернативную функцию пина включили?) я все режимы перебрал #define SPIx_SCK_PIN GPIO_Pin_3 #define SPIx_MISO_PIN GPIO_Pin_4 #define SPIx_MOSI_PIN GPIO_Pin_5 #define SPIx_SCK_SOURCE GPIO_PinSource3 #define SPIx_MISO_SOURCE GPIO_PinSource4 #define SPIx_MOSI_SOURCE GPIO_PinSource5 #define SPIx_GPIO_PORT GPIOB #define SPIx_AF GPIO_AF_5 #define CS1_HI (GPIOB->BSRR = GPIO_Pin_6) #define CS1_LO (GPIOB->BRR = GPIO_Pin_6) void SPI_Setup(SPI_TypeDef *SPIx) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; uint32_t spi_mode = 0; CS1_LO; GPIO_PinAFConfig(SPIx_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_AF); GPIO_PinAFConfig(SPIx_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_AF); GPIO_PinAFConfig(SPIx_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_AF); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* SPI SCK pin configuration */ GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN; GPIO_Init(SPIx_GPIO_PORT, &GPIO_InitStructure); /* SPI MOSI pin configuration */ GPIO_InitStructure.GPIO_Pin = SPIx_MOSI_PIN; GPIO_Init(SPIx_GPIO_PORT, &GPIO_InitStructure); /* SPI MISO pin configuration */ GPIO_InitStructure.GPIO_Pin = SPIx_MISO_PIN; GPIO_Init(SPIx_GPIO_PORT, &GPIO_InitStructure); //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); if (SPIx == SPI1) { RCC->APB2ENR |= RCC_APB2Periph_SPI1; } else if (SPIx == SPI2) { RCC->APB1ENR |= RCC_APB1Periph_SPI2; } else if (SPIx == SPI3) { RCC->APB1ENR |= RCC_APB1Periph_SPI3; } else return; /*!< SPI Config */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; switch(spi_mode) { case 0: SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; break; case 1: SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; break; case 2: SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; break; case 3: SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; break; } SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //APB1=36Mhz => ~1Mhz //APB2=72Mhz SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPIx, &SPI_InitStructure); /* SPI enable */ SPIx->CR1 |= SPI_CR1_SPE; } Изменено 11 мая, 2018 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Попробуйте сделать все это "в лоб" - ногодрыгом, все равно в данном случае (без прерываний и DMA) на такой низкой скорости разницы не будет. Если не заработает даже так, то проблему нужно искать где-то в другом месте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба А драйвер SPI вы сами писали? Если нет, то лучше проверить работу модуля по даташиту. Я давно (2 года назад) делал spi для stm32f051. Но смутно помню, что там были какие-то нюансы в настройках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Проверьте осцилографом уровни на линиях SPI. При несоответствии уровней для лог. анализатора они может и "прокатывают", и Вы видете как-бы идеальные диаграммы на ЛА, а процессор их видит неправильно. На самом деле могут быть "зализанные", задавленные итп. импульсы-уровни по разным причинам. Имеет смысл это проверить чтобы исключить из "реестра" возможных ошибок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 мая, 2018 Опубликовано 12 мая, 2018 · Жалоба Проверьте осцилографом уровни на линиях SPI. При несоответствии уровней для лог. анализатора они может и "прокатывают", и Вы видете как-бы идеальные диаграммы на ЛА, а процессор их видит неправильно. На самом деле могут быть "зализанные", задавленные итп. импульсы-уровни по разным причинам. Имеет смысл это проверить чтобы исключить из "реестра" возможных ошибок. даже лог. анализатор показывает спад и подъем МИСО синхронизированные с клоком. Так же быть не должно по моему? на подъеме или спаде клока сигнал должен присутствовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 12 мая, 2018 Опубликовано 12 мая, 2018 · Жалоба даже лог. анализатор показывает спад и подъем МИСО синхронизированные с клоком. Так же быть не должно по моему? на подъеме или спаде клока сигнал должен присутствовать. А значения CPOL, CPHA правильно установлены? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 13 мая, 2018 Опубликовано 13 мая, 2018 (изменено) · Жалоба А значения CPOL, CPHA правильно установлены? я не нашел в тех. описании драйвера требуемый СПИ режим поэтому перепробовал все switch(spi_mode) { case 0: SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; break; case 1: SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; break; case 2: SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; break; case 3: SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; break; } но если я правильно понимаю значение на МИСО пине берется либо по переднему либо по заднему фронту. А если они синфазны? мы не увидим правильные данные? поэтому наверное когда МИСО возвращает 0x07 - 0111 - контролер видит 0x03 - 0011 - биты идут подряд и два последних бита он берет по клоку. а скажем 0x09 - контроллер читает как 0 - биты стоят отдельно. Изменено 13 мая, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 15 мая, 2018 Опубликовано 15 мая, 2018 · Жалоба я не нашел в тех. описании драйвера требуемый СПИ режим поэтому перепробовал все То есть в даташите гадкие TI-шные инженеры спрятали figure 1 "SPI Slave Mode Timing Definition"? Или в reference manual'е не менее гадкие ST'шники убрали картинку "Data clock timing diagram" ? Сложнейшая задача "найди две картинки", не поспоришь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 15 мая, 2018 Опубликовано 15 мая, 2018 · Жалоба . . . А если они синфазны? мы не увидим правильные данные? . . .Их не увидим не только мы, но и слейв. -------- док на Ваш девайс DRV8303 SLOS846C –SEPTEMBER 2013–REVISED DECEMBER 2016 Fig 2 полярность клок - прямая защелка данных - по второму (Fail) фронту клока. Данные могут меняться по Raise клока (как у мастера, так и у слейва). По Fail клока данные изменяться не должны. На приведенных в начале диаграммах - это не выполняется. Проверьте эти настройки, но не через ф-ии в программе, а "обратным" методом - посмотрите как установились соотв-ие биты в регистрах настройки узла SPI. Сопоставьте Fig_2 и диаграммы настройки для SPI в документации на процессор. ps :) SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; Есть подозрение, что Вы битовому полю структуры присваиваете битовую маску, а не значение поля :) Хотя может и ошибаюсь. Проверьте, чему соотв-ет макро SPI_CPOL_Low итд Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 мая, 2018 Опубликовано 17 мая, 2018 · Жалоба Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 18 мая, 2018 Опубликовано 18 мая, 2018 · Жалоба Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К. Как вы это выяснили? :rolleyes: В даташите прямо противоположная информация, судя по двум рисункам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 18 мая, 2018 Опубликовано 18 мая, 2018 · Жалоба Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К. Неплохо было бы помотреть на хилую осцилограмму. Да и принц. схему тоже. Если исключить "подпаленный" верхний ключ в слейве, Может ЭТО ? pin 45 VDD_SPI I SPI supply pin to support 3.3V or 5V logic. Connect to either 3.3V or 5V. 7.3.4 Start-Up and Shutdown Sequence Control During power up, all gate drive outputs are held low. Normal operation of gate driver and current shunt amplifiers can be initiated by toggling EN_GATE from a low state to a high state. If no errors are present, the DRV8303 is ready to accept PWM inputs. Gate driver always has control of the power FETs even in gate disable mode as long as PVDD is within functional region. There is an internal diode from SDO to VDD_SPI, so VDD_SPI is required to be powered to the same power level as other SPI devices (if there is any SDO signal from other devices) all the time. VDD_SPI supply should be powered up first before any signal appears at SDO pin and powered down after completing all communications at SDO pin. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 мая, 2018 Опубликовано 19 мая, 2018 · Жалоба Неплохо было бы помотреть на хилую осцилограмму. Да и принц. схему тоже. Если исключить "подпаленный" верхний ключ в слейве, Может ЭТО ? pin 45 VDD_SPI I SPI supply pin to support 3.3V or 5V logic. Connect to either 3.3V or 5V. паразитная емкость исключается. проводник короткий. схема проста - пин контролера МИСО на пин драйвера SDATO + пулап. так что на больше чем 1М с этим драйвером не расчитывайте. в принципе больше и не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться