Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение по SPI из DRV8303
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Jenya7
Есть функции чтения/записи
Код
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) не читает правильно пин МИСО?
haker_fox
QUOTE (Jenya7 @ May 11 2018, 15:30) *
Почему контролер ( STM32F303CB) не читает правильно пин МИСО?

Режим SPI (0, 1, 2, 3) на микроконтроллере правильно настроили? Альтернативную функцию пина включили?)
Jenya7
Цитата(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;
}
Forger
Попробуйте сделать все это "в лоб" - ногодрыгом, все равно в данном случае (без прерываний и DMA) на такой низкой скорости разницы не будет.
Если не заработает даже так, то проблему нужно искать где-то в другом месте.
haker_fox
А драйвер SPI вы сами писали? Если нет, то лучше проверить работу модуля по даташиту. Я давно (2 года назад) делал spi для stm32f051. Но смутно помню, что там были какие-то нюансы в настройках.
k155la3
Проверьте осцилографом уровни на линиях SPI. При несоответствии уровней для лог. анализатора они может и "прокатывают",
и Вы видете как-бы идеальные диаграммы на ЛА, а процессор их видит неправильно.
На самом деле могут быть "зализанные", задавленные итп. импульсы-уровни по разным причинам.
Имеет смысл это проверить чтобы исключить из "реестра" возможных ошибок.
Jenya7
Цитата(k155la3 @ May 12 2018, 01:43) *
Проверьте осцилографом уровни на линиях SPI. При несоответствии уровней для лог. анализатора они может и "прокатывают",
и Вы видете как-бы идеальные диаграммы на ЛА, а процессор их видит неправильно.
На самом деле могут быть "зализанные", задавленные итп. импульсы-уровни по разным причинам.
Имеет смысл это проверить чтобы исключить из "реестра" возможных ошибок.
даже лог. анализатор показывает спад и подъем МИСО синхронизированные с клоком. Так же быть не должно по моему? на подъеме или спаде клока сигнал должен присутствовать.
Aleksandr Baranov
Цитата(Jenya7 @ May 12 2018, 13:15) *
даже лог. анализатор показывает спад и подъем МИСО синхронизированные с клоком. Так же быть не должно по моему? на подъеме или спаде клока сигнал должен присутствовать.

А значения CPOL, CPHA правильно установлены?
Jenya7
Цитата(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 - биты стоят отдельно.
esaulenka
Цитата(Jenya7 @ May 13 2018, 07:56) *
я не нашел в тех. описании драйвера требуемый СПИ режим поэтому перепробовал все

То есть в даташите гадкие TI-шные инженеры спрятали figure 1 "SPI Slave Mode Timing Definition"?
Или в reference manual'е не менее гадкие ST'шники убрали картинку "Data clock timing diagram" ?

Сложнейшая задача "найди две картинки", не поспоришь...
k155la3
Цитата(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 итд
Jenya7
Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К.
haker_fox
QUOTE (Jenya7 @ May 17 2018, 20:55) *
Выяснилось что МИСО пин драйвера прямо скажем хилый. Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К.

Как вы это выяснили? rolleyes.gif В даташите прямо противоположная информация, судя по двум рисункам.
k155la3
Цитата(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.


Jenya7
Цитата(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М с этим драйвером не расчитывайте. в принципе больше и не надо.
Serge V Iz
постоянная времени при R=3.3k и C=всего лишь 100p уже будет 330n - треть периода 1M ) А сколько там его открытый коллектор может по току? Может, еще усилить подтяжку?
Jenya7
Цитата(Serge V Iz @ May 20 2018, 11:40) *
постоянная времени при R=3.3k и C=всего лишь 100p уже будет 330n - треть периода 1M ) А сколько там его открытый коллектор может по току? Может, еще усилить подтяжку?

в принципе можно, но я катушку в блоке питания недорасчитал - кипит. экономлю на каждом милиампере. я не понимаю зачем разработчики так извратились, все чипы с которыми работал до сих пор гонят себе 20 мега, да те же тексасовские, зачем велосипед изобретать там где хорошо работает.
k155la3
Судя по осцилограмме - явный криминал.
В линию MISO (в разрыв) включите резистор 100-400 Ом. Снимите осцилограммы на обоих выводах резистора.
Если осц. одинаковая - подпален выход слейва (или лапа MISO висит в воздухе). Если разная - "садит" по входу мастера.
Думаю, ТС джентльмен, и не утаил от нас, если на линиях SPI еще что висит, или элементарно "сопля" между лапами процессора sm.gif

кстати.
Цитата
Опен дрейн и на нем пулап 10К. Не тянул пока не понизил частоту до 1М и пулап до 3.3К.

где в даташите упоминание об Опен дрейн для SPI ?

какие "подтяжки" для SPI ? На примере схемы в даташите ничего подобного нет.
Я "ставлю" на "соплю" или непропаянный вывод MISO sm.gif
jcxz
Цитата(k155la3 @ May 20 2018, 19:42) *
где в даташите упоминание об Опен дрейн для SPI ?

Не опен-драйн, а Z-состояние. В которое слэйв обязан переводить MISO при снятии CS. И это не в даташите, а в описании SPI-интерфейса. Это следует из самой логики работы SPI.

Цитата(k155la3 @ May 20 2018, 19:42) *
какие "подтяжки" для SPI ? На примере схемы в даташите ничего подобного нет.

Может и нет, но как показывает практика, подтяжка по MISO часто увеличивает стабильность работы SPI на высоких SCLK (или подтяжка по MOSI/MISO в случае если с одним из слэйвов на шине используется dual-SPI).
Serge V Iz
Да, вроде, в самом деле, ОК.
---
Тьфу, не тот обвел ) на две строчки ниже )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.