|
Чтение по SPI из DRV8303 |
|
|
|
May 11 2018, 07:30
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Есть функции чтения/записи Код 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) не читает правильно пин МИСО?
Сообщение отредактировал Jenya7 - May 11 2018, 08:23
Эскизы прикрепленных изображений
|
|
|
|
|
May 11 2018, 09:14
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(haker_fox @ May 11 2018, 14:55)  Режим SPI (0, 1, 2, 3) на микроконтроллере правильно настроили? Альтернативную функцию пина включили?) я все режимы перебрал CODE #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; }
Сообщение отредактировал IgorKossak - May 11 2018, 19:07
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
May 12 2018, 18:44
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Цитата(Jenya7 @ May 12 2018, 13:15)  даже лог. анализатор показывает спад и подъем МИСО синхронизированные с клоком. Так же быть не должно по моему? на подъеме или спаде клока сигнал должен присутствовать. А значения CPOL, CPHA правильно установлены?
--------------------
ASB
|
|
|
|
|
May 13 2018, 04:56
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Aleksandr Baranov @ May 12 2018, 23:44)  А значения 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 - биты стоят отдельно.
Сообщение отредактировал Jenya7 - May 13 2018, 05:54
|
|
|
|
|
May 15 2018, 09:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Jenya7 @ May 13 2018, 07:56)  я не нашел в тех. описании драйвера требуемый СПИ режим поэтому перепробовал все То есть в даташите гадкие TI-шные инженеры спрятали figure 1 "SPI Slave Mode Timing Definition"? Или в reference manual'е не менее гадкие ST'шники убрали картинку "Data clock timing diagram" ? Сложнейшая задача "найди две картинки", не поспоришь...
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
May 15 2018, 09:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ May 13 2018, 07:56)  . . . А если они синфазны? мы не увидим правильные данные? . . . Их не увидим не только мы, но и слейв. -------- док на Ваш девайс 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 итд
|
|
|
|
|
May 18 2018, 09:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ May 17 2018, 15:55)  Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|