реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Чтение по SPI из DRV8303
Jenya7
сообщение May 11 2018, 07:30
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 11 2018, 08:55
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Jenya7 @ May 11 2018, 15:30) *
Почему контролер ( STM32F303CB) не читает правильно пин МИСО?

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 11 2018, 09:14
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 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] - для короткого!
Go to the top of the page
 
+Quote Post
Forger
сообщение May 11 2018, 09:54
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 11 2018, 14:12
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 11 2018, 19:43
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Проверьте осцилографом уровни на линиях SPI. При несоответствии уровней для лог. анализатора они может и "прокатывают",
и Вы видете как-бы идеальные диаграммы на ЛА, а процессор их видит неправильно.
На самом деле могут быть "зализанные", задавленные итп. импульсы-уровни по разным причинам.
Имеет смысл это проверить чтобы исключить из "реестра" возможных ошибок.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 12 2018, 17:15
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ May 12 2018, 01:43) *
Проверьте осцилографом уровни на линиях SPI. При несоответствии уровней для лог. анализатора они может и "прокатывают",
и Вы видете как-бы идеальные диаграммы на ЛА, а процессор их видит неправильно.
На самом деле могут быть "зализанные", задавленные итп. импульсы-уровни по разным причинам.
Имеет смысл это проверить чтобы исключить из "реестра" возможных ошибок.
даже лог. анализатор показывает спад и подъем МИСО синхронизированные с клоком. Так же быть не должно по моему? на подъеме или спаде клока сигнал должен присутствовать.
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение May 12 2018, 18:44
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



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

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


--------------------
ASB
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 13 2018, 04:56
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
esaulenka
сообщение May 15 2018, 09:06
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 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" ?

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 15 2018, 09:40
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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 sm.gif
Код
       SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;  
                SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;

Есть подозрение, что Вы битовому полю структуры присваиваете битовую маску, а не значение поля sm.gif
Хотя может и ошибаюсь. Проверьте, чему соотв-ет макро SPI_CPOL_Low итд
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 17 2018, 12:55
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 18 2018, 00:35
Сообщение #13


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Jenya7 @ May 17 2018, 20:55) *
Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К.

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 18 2018, 09:58
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 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.


Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 19 2018, 21:16
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ May 18 2018, 14:58) *
Неплохо было бы помотреть на хилую осцилограмму. Да и принц. схему тоже. Если исключить "подпаленный" верхний ключ в слейве,
Может ЭТО ?
pin 45 VDD_SPI I SPI supply pin to support 3.3V or 5V logic. Connect to either 3.3V or 5V.


паразитная емкость исключается. проводник короткий. схема проста - пин контролера МИСО на пин драйвера SDATO + пулап. так что на больше чем 1М с этим драйвером не расчитывайте. в принципе больше и не надо.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 20:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016