кста, может ктонить ответит!
я сделал 2 варианта чтения/записи по SPI - картой мы заменили микросхему от атмеги (spi eeprom)
первый вариант с библиотекой от STM
второй вариант с библиотекой от opencm3
вот что мне непонятно -
1) код с библиотекой STM в два раза компактнее!
2) код от STM работает всегда, а opencm3 иногда начинает глючить
вполне возможно я сделал неправилбно инициализацию SPI
помогите разобраться!
CODE
/**
* @brief Initializes the SPI and CS pins.
* @param None
* @retval None
*/
void spi_init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(SD_SPI_SCK_GPIO_CLK | SD_SPI_CS_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);
/* Enable SPI clock */
RCC_APB1PeriphClockCmd(SD_SPI_CLK, ENABLE);
/* Configure SPI pins: SCK and MOSI */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(SD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
// MOSI
GPIO_InitStructure.GPIO_Pin = SD_SPI_MOSI_PIN;
GPIO_Init(SD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
// MISO
GPIO_InitStructure.GPIO_Pin = SD_SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(SD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
/* CS */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SD_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SD_SPI_CS_GPIO_PORT, &GPIO_InitStructure);
SD_CS_HIGH();
/* SPI Config */
SPI_StructInit(&SPI_InitStructure);
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_64;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SD_SPI, &SPI_InitStructure);
SPI_CalculateCRC(SD_SPI, DISABLE);
SPI_NSSInternalSoftwareConfig(SD_SPI, SPI_NSSInternalSoft_Set);
/* SPI enable */
SPI_Cmd(SD_SPI, ENABLE);
}
void spi_set_full_speed(void)
{
uint32_t tmp = SD_SPI->CR1;
tmp = (tmp & ~SPI_BaudRatePrescaler_64) | SPI_BaudRatePrescaler_2;
SD_SPI->CR1 = tmp;
}
и код opencm3
CODE
/**
* @brief Initializes the SD_SPI and CS pins.
* @param None
* @retval None
*/
void spi_init(void)
{
rcc_periph_clock_enable(RCC_GPIOB);
rcc_periph_clock_enable(RCC_GPIOA);
rcc_periph_clock_enable(RCC_AFIO);
rcc_periph_clock_enable(RCC_SPI2);
/* Configure SPI2: PB13(SCK), PB14(MISO), PB15(MOSI). */
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_10_MHZ,
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_SPI2_SCK | GPIO_SPI2_MOSI);
gpio_set_mode(GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_SPI2_MISO);
/* Enable CS pin on PA5. */
gpio_set(GPIOA, GPIO5);
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO5);
/* Explicitly disable I2S in favour of SPI operation */
SPI1_I2SCFGR = 0;
/* Set up SPI in Master mode with:
* Clock baud rate: 1/2 of peripheral clock frequency
* Clock polarity: Idle High
* Clock phase: Data valid on 2nd clock pulse
* Data frame format: 8-bit
* Frame format: MSB First
*/
spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_64,
SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE,
SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);
/*
* Set NSS management to software.
*
* Note:
* Setting nss high is very important, even if we are controlling the GPIO
* ourselves this bit needs to be at least set to 1, otherwise the spi
* peripheral will not send any data out.
*/
spi_enable_software_slave_management(SPI2);
spi_set_nss_high(SPI2);
spi_enable(SPI2); /* Enable SPI2 periph. */
}
/* Set fast clock (depends on the CSD) */
void spi_set_full_speed(void)
{
/* spi_disable(SPI2); */
spi_set_baudrate_prescaler(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_2);
/* spi_enable(SPI2); */
}
В чем может быть засада? проц 103 -й