Цитата(x893 @ Jul 28 2016, 17:47)

Функция SPI Receive в HAL занимает строк 20 из них 10 фуфло всякое. Пройдите по шагам и посмотрите что там делается. За пять минут (вместо дня гадания) уже всё определили бы и получали свои байты.
Никакого гадания нет. Уже давно все посмотрел. Потому и поднял тему, что не понятно каким образом аппартано в регистр DR залетает мусор и на выходе HAL-функции получаем полный бред, портящий буфер приема.
на всякий случай SPI проинициализирован вот так:
Код
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
Цитата(x893 @ Jul 28 2016, 23:19)

Проверил с stm32f030 и CC2500 - всё работает как часы.
Проверьте инициализацию spi
SPI_DIRECTION_2LINES
SPI_CRCCALCULATION_ENABLE
SPI_DATASIZE_8BIT
и пройдите по шагам
HAL_StatusTypeDef HAL_SPI_Receive(...
никаких чудес нет.
SPI_CS программный у меня.
Там все понятно. Если байтов принимается > 1, то включается 16 бит режим - SPI пофигу, а процессору меньше работы.
Последний байт (если есть) принимается в 8-бит режиме. Но можно использовать от 4-х бит до 9-бит (байтовый обмен) или от 9 до 16 (2 байта на обмен)
Но проще посмотреть дебаггером, что конкретно происходит.
читаю от CC2500 три регистра:
Код
cmd_byte = ( (regAddr & 0x3f) | TI_CCxxx0_READ_BURST ); // regAddr - начальный адрес регистра
CS_LO(); // /CS = 0
HAL_SPI_Transmit(&hspi1, &cmd_byte, 1, 10000);
HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf1[0], 1, 10000);
data1 = localRxBuf1[0];
HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf2[0], 1, 10000);
data2 = localRxBuf2[0];
HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf3[0], 1, 10000);
data3 = localRxBuf3[0];
CS_HI(); // /CS = 1
на выходе в data1,data3,data3 путаница
А на осциллографе совершенно правильная картинка.....и на MISO и на MOSI
Попробуйте пж-ста мою конструкцию....заработает ли у вас? .......не могу понять что у меня происходит
в CC2500 для теста пишу так:
Код
uint8_t localRxBuf1[16];
uint8_t localRxBuf2[16];
uint8_t localRxBuf3[16];
uint8_t localRxBuf4[16];
uint8_t data1,data2,data3;
uint16_t dataX1,dataX2,dataX3;
CC2500_Init();
CC2500_WriteRegSingle(0x09, 0x55);
CC2500_WriteRegSingle(0x0A, 0x33);
CC2500_WriteRegSingle(0x0B, 0x07);
while(1)
{
HAL_Delay(1000);
cmd_byte = ( 0x09 | TI_CCxxx0_READ_BURST ); // regAddr - начальный адрес регистра
CS_LO(); // /CS = 0
HAL_SPI_Transmit(&hspi1, &cmd_byte, 1, 10000);
HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf1[0], 1, 10000);
data1 = localRxBuf1[0];
dataX1=(uint16_t)hspi1.Instance->DR;
HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf2[0], 1, 10000);
data2 = localRxBuf2[0];
dataX2=(uint16_t)hspi1.Instance->DR;
HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf3[0], 1, 10000);
data3 = localRxBuf3[0];
dataX3=(uint16_t)hspi1.Instance->DR;
CS_HI(); // /CS = 1
}
[/code]
Значения dataX1 dataX2 dataX3 по циклам:
0x000F - 0x3355 - 0x0007
0x0733 - 0x0007 - 0x5500
0x0733 - 0x0007 - 0x5500
0x0733 - 0x0007 - 0x5500
0x0733 - 0x0007 - 0x5500
0x0733 - 0x0007 - 0x5500
0x0733 - 0x0007 - 0x5500
0x0733 - 0x0007 - 0x5500
.......
p.s.
с работы сторожа выгоняют...появлюсь через 30 минут ( в 0:10)
Сообщение отредактировал Pasa - Jul 28 2016, 20:28