Форум РадиоКот https://radiokot.ru/forum/ |
|
Передача данных по SPI, между АЦП и микроконтроллером - ARM https://radiokot.ru/forum/viewtopic.php?f=59&t=143880 |
Страница 1 из 1 |
Автор: | MrPsevdonimka [ Вс апр 02, 2017 09:57:14 ] |
Заголовок сообщения: | Передача данных по SPI, между АЦП и микроконтроллером - ARM |
Добрый день. Пытаюсь передать "настроечные" биты с МК STM32F051C8 на АЦП LTC2498 , но даже в регистр передачи DR ничего не заносится, он как был пустой, таким и остается. Код: #include "stm32f0xx.h" #include "stm32f0xx_rcc.h" #include "stm32f0xx_gpio.h" #include "stm32f0xx_spi.h" #define CS_ON() GPIO_ResetBits(GPIOB, GPIO_Pin_12) #define CS_OFF() GPIO_SetBits(GPIOB, GPIO_Pin_12) uint16_t SPIdata=0; void Allini(void) { GPIO_InitTypeDef GPIO_spi; SPI_InitTypeDef SPI_ini; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); GPIO_spi.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_spi.GPIO_Mode = GPIO_Mode_AF; GPIO_spi.GPIO_Speed = GPIO_Speed_50MHz; GPIO_spi.GPIO_OType = GPIO_OType_PP; GPIO_spi.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_spi); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_1); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); GPIO_spi.GPIO_Pin = GPIO_Pin_12; GPIO_spi.GPIO_Mode = GPIO_Mode_OUT; GPIO_spi.GPIO_Speed = GPIO_Speed_50MHz; GPIO_spi.GPIO_OType = GPIO_OType_PP; GPIO_spi.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_spi); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); SPI_ini.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_ini.SPI_Mode = SPI_Mode_Master; SPI_ini.SPI_DataSize = SPI_DataSize_16b; SPI_ini.SPI_CPOL = SPI_CPOL_Low; SPI_ini.SPI_CPHA = SPI_CPHA_1Edge; SPI_ini.SPI_NSS = SPI_NSS_Soft; SPI_ini.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_ini.SPI_FirstBit = SPI_FirstBit_MSB; SPI_ini.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_ini); SPI_Cmd(SPI2, ENABLE); } int main(void) { Allini(); while(1) { CS_ON(); SPI_I2S_SendData16(SPI2, 0x12F0); while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {} SPIdata = SPI_I2S_ReceiveData16(SPI2); while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {} SPI_I2S_SendData16(SPI2, 0x00); while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) {} SPIdata = SPI_I2S_ReceiveData16(SPI2); CS_OFF(); } Данное число: 0x12F0 - это и есть та настройка АЦП, которую я пытаюсь ему передать. 0x12F0 получилось исходя из таблицы в даташите (стр. 22): Вложение: Вот что получилось: Вложение: В режиме отладки, даже если я ничего не получаю, а просто заношу что-то в DR, я же должен видеть в нем это "что-то", так? |
Автор: | MrPsevdonimka [ Пн апр 03, 2017 06:31:46 ] |
Заголовок сообщения: | Re: Передача данных по SPI, между АЦП и микроконтроллером - |
Мне тут подсказали, что DR не является 100% детектором работы SPI, так как keil может попросту не успевать регистрировать исходящие данные. (смотрю DR в режиме отладки) Еще я пробовал проверить работу модуля с помощью осциллографа: SCK выдавал импульсы, а MISO и MOSI молчали. |
Автор: | Radist_M [ Сб апр 08, 2017 08:47:13 ] |
Заголовок сообщения: | Re: Передача данных по SPI, между АЦП и микроконтроллером - |
Странно почему есть клок но нет MOSI..А нога NSS опускается при передаче? Быть может имеет смысл инициализировать модуль SPI вручную без HAL. Будете тщательнее читать даташит и наткнетесь на ответ. UPD Вот что сказано в даташите: Цитата: Software NSS management (SSM = 1): in this configuration, slave select information is driven internally by the SSI bit value in register SPIx_CR1. The external NSS pin is free for other application uses А у нас как раз софтовый режим управления NSS. Наверно нужно выставлять бит в регистре SPIx_CR1. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |