|
|
  |
STM32F103.... и SPI3, прошу совета |
|
|
|
Jan 27 2012, 18:18
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923

|
Здравствуйте!столкнулся тут с проблемой решил подключить к процу STM32F103 флешпамять внешнюю m25p64 на SPI3, т.к. остальные уже задействованы. но на этом SPI сидит еще и JTAG я программно сделал ремап, отключив JTAG и оставив только SWD и на всякий случай убрал из жгута эти два проводка. но SPI все равно не работает...по отладчику все проходит, флаги ставятся и т.п. но ничего не принимает...а когда я посмотрел осциллографом оказалось что физически работает только линия выборки CS которая программно сбрасывается и выставляется, на остальных выводах глухо хотя использую стандартные функции по интерфейсу... может кто сталкивался?
|
|
|
|
|
Jan 27 2012, 20:47
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923

|
вот текст инициализации....проверял несколько раз, да и при пошаговом поспроизведении по регистрам смотрел - вроде все верно CODE //функция инициализации SPI
/* Includes ------------------------------------------------------------------*/ #include "spi_flash.h"
/* Private typedef -----------------------------------------------------------*/ #define SPI_FLASH_PageSize 0x100 //размер страницы
/* Private define ------------------------------------------------------------*/ #define FLASH_ID 0x202017
#define WRITE 0x02 // Команда записи в память #define WRSR 0x01 // Команда записи регистра статуса #define WREN 0x06 // Команда разрешения на запись
#define READ 0x03 // Команда чтения из памяти #define RDSR 0x05 // Команда чтения регистра статуса #define RDID 0x9F // Команда чтения идентификатора #define SE 0xD8 // Команда очистки сектора #define BE 0xC7 // Команда полной очистки
#define WIP_Flag 0x01 // Write In Progress (WIP) flag
#define Dummy_Byte 0xA5 #define SPI_port SPI3
__IO uint32_t FlashID_m25p64 = 0;
uint8_t SPI_FLASH_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //выключаем JTAG, SW отстается включенным GPIO_InitStructure.GPIO_Pin = 3 | 5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = 4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = 12 | 15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOG, &GPIO_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); SPI_FLASH_CS_HIGH();// отмена выбора памяти // RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPInn, DISABLE); // конфигурация SPI3 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI_port, &SPI_InitStructure); SPI_Cmd(SPI_port, ENABLE); // загрузка SPI3 FlashID_m25p64 = SPI_FLASH_ReadID(); //считываем идентификатор if(FlashID_m25p64==FLASH_ID) { return 1;//успешная проверка } else { return 0;//идентификатор не совпал } } остальные функции не стал писать, они базовые а проц STM32F103VG с 1мб
Причина редактирования: [codebox]
|
|
|
|
|
Jan 28 2012, 08:36
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923

|
т.е. надо в режиме писать GPIO_Mode_AF_PP? но дело в том что я это пробовал
а тактирование GPIO и AFIO включается в отдельно в начале проги,а тут дело в том что подобным образом сделано общение с АЦП через SPI2 и там работает
|
|
|
|
|
Jan 30 2012, 06:23
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923

|
спасибо.оказалось все дело в настройке двух пинов было...просто когда до этого я их в альтернативный режим переводил я не делал ремап jtag,а после не пробовал. сейчас все заработало
|
|
|
|
|
Jan 30 2012, 07:05
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Valentin-k @ Jan 30 2012, 09:23)  сейчас все заработало По чистой случайности, видимо. Цитата(Valentin-k @ Jan 27 2012, 23:47)  GPIO_InitStructure.GPIO_Pin = 3 | 5; GPIO_InitStructure.GPIO_Pin = 4; GPIO_InitStructure.GPIO_Pin = 12 | 15; Тут ИМХО маски битовые должны быть (1<<3)|(1<<5), (1<<4) и т.д. Гляньте как в заголовочных файлах определены GPIO_Pin_12, GPIO_Pin_XX - многое поймёте. И лучше эти (GPIO_Pin_XX) дефайны и используйте раз уж библиотекой пользуетесь.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 30 2012, 07:25
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923

|
маски я тоже выставил...правда в подробности не вдавался,по примеру смотрел спасибо.
|
|
|
|
|
May 22 2015, 09:26
|
Группа: Новичок
Сообщений: 1
Регистрация: 22-05-15
Пользователь №: 86 821

|
Privet, toze nemagu zapustit SPI3 na stm32F103vet6. Kogda meniaju na na SPI1 ili SPI2 to rabotajet. Nasol eto obsuzdenije i obradyvalsia no poproboval dobavit " GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); " vsio takze nerabotajet. mozet ja zacyklilsia i uze nevizu problemy ocividnaj. :S CODE void SPI3_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
// Enable SPI3 and GPIOA clocks RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_ GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable | GPIO_Remap_SWJ_NoJTRST, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // CS pin GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure);
// Configure SPI3 pins: SCK, MISO and MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);
// SPI3 configuration SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI3, &SPI_InitStructure);
// Enable SPI3 SPI_Cmd(SPI3, ENABLE); }
unsigned char SPI3_ReadWrite(unsigned char writedat) { /* Loop while DR register in not emplty */ while (SPI_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI3 peripheral */ SPI_SendData(SPI3, writedat);
/* Wait to receive a byte */ while (SPI_GetFlagStatus(SPI3, SPI_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */ return SPI_ReceiveData(SPI3); }
Сообщение отредактировал IgorKossak - May 22 2015, 15:53
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|