Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103.... и SPI3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Valentin-k
Здравствуйте!столкнулся тут с проблемой
решил подключить к процу STM32F103 флешпамять внешнюю m25p64 на SPI3, т.к. остальные уже задействованы.
но на этом SPI сидит еще и JTAG
я программно сделал ремап, отключив JTAG и оставив только SWD и на всякий случай убрал из жгута эти два проводка.
но SPI все равно не работает...по отладчику все проходит, флаги ставятся и т.п. но ничего не принимает...а когда я посмотрел осциллографом оказалось что физически работает только линия выборки CS которая программно сбрасывается и выставляется, на остальных выводах глухо
хотя использую стандартные функции по интерфейсу...
может кто сталкивался?
AHTOXA
А какой именно у вас STM32F103? Там точно есть SPI3? sm.gif
Если есть, то показывайте код инициализации, чудес-то не бывает.
Valentin-k
вот текст инициализации....проверял несколько раз, да и при пошаговом поспроизведении по регистрам смотрел - вроде все верно
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мб
controller_m30
Вот тут может быть причина...
Посмотрите, в каком режиме функционируют выходы GPIOB - "General purpose output push-pull" или "Alternate function output Push-pull" (то, что у Вас задается командами вида "GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP").
Если при записи данных в "Port output data register (GPIOx_ODR)" эти данные появляются на выходных линиях - значит режим "Alternate function output Push-pull" не включен.
А именно этот режим нужен, чтобы использовать SPI, I2C и прочую периферию (для I2C - "Alternate function output Open-drain").
AHTOXA
Цитата(Valentin-k @ Jan 28 2012, 02:47) *
вот текст инициализации....

Не вижу включения тактирования GPIO и AFIO. Про неправильный режим ножек уже сказали.
Valentin-k
т.е. надо в режиме писать GPIO_Mode_AF_PP? но дело в том что я это пробовал

а тактирование GPIO и AFIO включается в отдельно в начале проги,а тут дело в том что подобным образом сделано общение с АЦП через SPI2 и там работает
Valentin-k
спасибо.оказалось все дело в настройке двух пинов было...просто когда до этого я их в альтернативный режим переводил я не делал ремап jtag,а после не пробовал.
сейчас все заработало
demiurg_spb
Цитата(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) дефайны и используйте раз уж библиотекой пользуетесь.
Valentin-k
маски я тоже выставил...правда в подробности не вдавался,по примеру смотрел
спасибо.
Jerioma
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);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.