Перейти к содержанию

Чтение по SPI из DRV8303

Есть функции чтения/записи
Код
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
QUOTE (Jenya7 @ May 11 2018, 15:30) <{POST_SNAPBACK}>
Почему контролер ( STM32F303CB) не читает правильно пин МИСО?

Режим SPI (0, 1, 2, 3) на микроконтроллере правильно настроили? Альтернативную функцию пина включили?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(haker_fox @ May 11 2018, 14:55) <{POST_SNAPBACK}>
Режим 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
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Попробуйте сделать все это "в лоб" - ногодрыгом, все равно в данном случае (без прерываний и DMA) на такой низкой скорости разницы не будет.
Если не заработает даже так, то проблему нужно искать где-то в другом месте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А драйвер SPI вы сами писали? Если нет, то лучше проверить работу модуля по даташиту. Я давно (2 года назад) делал spi для stm32f051. Но смутно помню, что там были какие-то нюансы в настройках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Проверьте осцилографом уровни на линиях SPI. При несоответствии уровней для лог. анализатора они может и "прокатывают",
и Вы видете как-бы идеальные диаграммы на ЛА, а процессор их видит неправильно.
На самом деле могут быть "зализанные", задавленные итп. импульсы-уровни по разным причинам.
Имеет смысл это проверить чтобы исключить из "реестра" возможных ошибок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(k155la3 @ May 12 2018, 01:43) <{POST_SNAPBACK}>
Проверьте осцилографом уровни на линиях SPI. При несоответствии уровней для лог. анализатора они может и "прокатывают",
и Вы видете как-бы идеальные диаграммы на ЛА, а процессор их видит неправильно.
На самом деле могут быть "зализанные", задавленные итп. импульсы-уровни по разным причинам.
Имеет смысл это проверить чтобы исключить из "реестра" возможных ошибок.
даже лог. анализатор показывает спад и подъем МИСО синхронизированные с клоком. Так же быть не должно по моему? на подъеме или спаде клока сигнал должен присутствовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Jenya7 @ May 12 2018, 13:15) <{POST_SNAPBACK}>
даже лог. анализатор показывает спад и подъем МИСО синхронизированные с клоком. Так же быть не должно по моему? на подъеме или спаде клока сигнал должен присутствовать.

А значения CPOL, CPHA правильно установлены?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Aleksandr Baranov @ May 12 2018, 23:44) <{POST_SNAPBACK}>
А значения 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
я не нашел в тех. описании драйвера требуемый СПИ режим поэтому перепробовал все

То есть в даташите гадкие TI-шные инженеры спрятали figure 1 "SPI Slave Mode Timing Definition"?

Или в reference manual'е не менее гадкие ST'шники убрали картинку "Data clock timing diagram" ?

 

Сложнейшая задача "найди две картинки", не поспоришь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
. . . А если они синфазны? мы не увидим правильные данные? . . .
Их не увидим не только мы, но и слейв.

--------

док на Ваш девайс 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 итд

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К.

Как вы это выяснили? :rolleyes: В даташите прямо противоположная информация, судя по двум рисункам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 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.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Неплохо было бы помотреть на хилую осцилограмму. Да и принц. схему тоже. Если исключить "подпаленный" верхний ключ в слейве,

Может ЭТО ?

pin 45 VDD_SPI I SPI supply pin to support 3.3V or 5V logic. Connect to either 3.3V or 5V.

 

паразитная емкость исключается. проводник короткий. схема проста - пин контролера МИСО на пин драйвера SDATO + пулап. так что на больше чем 1М с этим драйвером не расчитывайте. в принципе больше и не надо.

post-71075-1526764350_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация