Всем добра!
stm32f030f4p6. Keil4.
Проблема в том, чтобы заставить stm32f030f4p6 отправлять по spi ровно 8 бит, ибо как ни крути - шлет 16 и все.
В кейле пишу с использованием cmsis. Связь устанавливается по spi с nrf24l01. nrf24l01 умеет spi только по 8 бит.
пробовал следующие вещи:( отсюда
http://electronix.ru/forum/lofiversion/ ... 06624.html )
#define SPI1_DR_8b (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))
...
SPI1_DR_8b = 0x00; // шлем (00000000), на что nrf24l01 вернет нам значение данного регистра.
... // ждем пока на spi придет ответный байт.
uint8_t result = SPI1_DR_8b; // получаем какой-то результат, чаще всего либо ничего не приходит, либо приходит чтото наподобие 0E.
и отсюда: (
http://kazus.ru/forums/showthread.php?t=107109 )
#define SPI1_DR_8bit (*(__IO uint8_t *)((uint32_t)&(SPI1->DR)))
результат аналогичный первому.
При использовании стандартных функций из библиотек:
SPI_SendData8 и SPI_ReceiveData8 - результат такой же что и в первом варианте.
В spi cr2 выставляется бит DS = 0x07, FRXTH = 1
При программной реализации на тех же пинах все работает, но получается слишком ресурсоемко.
При чтение и записи 3 и 4 пины прижимаю к земле, как и нужно при общении с nrf24l01. Осцила нет, чтобы проконтролировать работу spi. но пробовал к raspberry pi целпять, она не успевает регистрировать импульсы.
Инициализация такая:
Код:
void initAll()
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef usart;
GPIO_InitTypeDef port;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_Pin_5,GPIO_AF_0);
GPIO_PinAFConfig(GPIOA, GPIO_Pin_6,GPIO_AF_0);
GPIO_PinAFConfig(GPIOA, GPIO_Pin_7,GPIO_AF_0);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
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_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_CalculateCRC(SPI1, DISABLE);
SPI_Cmd(SPI1, ENABLE);
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
}