Шлются посылки от 1 до 10 байт (случайная длина). Вот что получается:
Код
=====
.11 .22 .33 .44 .55 11] .11 .22 .33 .44 .55 .66 .77 88] .11 .22 .33 .11 .22 .33 .44
.55 .66 77] .11 .22 .33 .44 .55 .11 .22 .33 .44 .11 .22 .33 .44 .11 .22 .33 .44 .11
.22 .33 .44 .55 .66 77] .11 .22 .33 .44 .55 .66 .77 .11 .22 .33 .44 .55 .66 77] .11
.22 .33 .44 .55 .11 .22 .33 .44 55] .11 .22 .33 .44 .55 .11 .22 .33 .44 .55 .66 .77
.88 .11 .22 .33 .44 .55 .66 .77 .88 .11 .22 .33 .44 .55 .66 .77 .88 .99 .00 .11 .22
.33 .44 55] .11 .22 .33 .44 .55 .66 .77 .11 .22 .33 .44 .55 .66 77] .11 .22 .33 .44
.55 .66 .77 .88 .99 .11 .22 .33 .44 .55 .66 .77 .88 11] .11 .11 .22 .33 .44 .55 .66
.77 .88 99]
В spi_receive после приема я ловлю статус Slave Select и если он отпущен то знак ] если нет то точка. Видно что тут ".33 .11" последний байт .44] был потерян. Когда теряется последний байт то и статус SS тоже видно что еще активен.
Код
bool spi_receive(unsigned char &data)
{
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
data = (unsigned char) SPI_ReceiveData8(SPI2);
delay_1us(3);
return spi_cs();
}
bool spi_cs()
{
return (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == RESET);
}
void init_spi()
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
GPIO_InitTypeDef spi_gpio;
GPIO_StructInit(&spi_gpio);
spi_gpio.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
spi_gpio.GPIO_Mode = GPIO_Mode_AF;
spi_gpio.GPIO_Speed = GPIO_Speed_50MHz;
spi_gpio.GPIO_OType = GPIO_OType_PP;
spi_gpio.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOB, &spi_gpio);
GPIO_StructInit(&spi_gpio);
spi_gpio.GPIO_Pin = GPIO_Pin_12;
spi_gpio.GPIO_Mode = GPIO_Mode_IN;
spi_gpio.GPIO_Speed = GPIO_Speed_50MHz;
spi_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &spi_gpio);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_5);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_5);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_5);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_5);
SPI_I2S_DeInit(SPI2);
SPI_InitTypeDef spi_port;
SPI_StructInit(&spi_port);
spi_port.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi_port.SPI_Mode = SPI_Mode_Slave;
spi_port.SPI_DataSize = SPI_DataSize_8b;
spi_port.SPI_CPOL = SPI_CPOL_Low;
spi_port.SPI_CPHA = SPI_CPHA_1Edge;
spi_port.SPI_NSS = SPI_NSS_Soft;
spi_port.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI2, &spi_port);
SPI_Cmd(SPI2, ENABLE);
spi_clear();
}
---------------
Цитата(aaarrr @ Sep 16 2015, 14:47)

Напрасно

Посмотрите на картинку структуры IO в мануале.
Спасибо, читается. Однако это плохой признак начала-конца пакета, почему-то иногда теряет байт иногда нет. Но главное что простой тест:
Код
int test = 0;
while(true)
{
if(spi_cs()) usart_t("|", 1);
else usart_t(".", 1);
test++;
if(test > 50)
{
usart_tx("", 0);
test = 0;
}
}
bool spi_cs()
{
return (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == RESET);
}
показывает четкие chip select-ы.