Potrzebuje czytac dane z adc zewnetrznego, lacznie 32 bity.
i uzycie:
Na oscyloskopie widze prawidlowa transmisje, lecz do buf1 i buf2 wpisuje te same wartosci - jedynie pierwsze 16b, ktore ADC zwraca. Dane odebrane zgadzaja sie z tym co widze na oscyloskopie, wiec teoretycznie mam te 16b, ale przydaloby sie uzyskac wieksza rozdzielczosc przetwornika...
Pewnie da sie to zrealizowac przy pomocy DMA, ale czy ktos ma pomysl jak uzyskac te 32b bez DMA.
Code:
void spi_init(void){
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_12 |*/ GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
SPI_I2S_DeInit(SPI2);
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_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_Init(SPI2,&SPI_InitStructure);
SPI_Cmd(SPI2,ENABLE);
}
i uzycie:
Code:
GPIOB->BRR = 1<<12; // CS
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, 0x0000); // Send SPI1 data
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
buf1 = SPI_I2S_ReceiveData(SPI2); // Read SPIz received data
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, 0x0000); // Send SPI1 data
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
buf2 = 0;
buf2 = SPI_I2S_ReceiveData(SPI2); // Read SPIz received data
/*if(SPI2->SR & 0x0040){
buf2=buf2;
}*/
GPIOB->BSRR = 1<<12;
Na oscyloskopie widze prawidlowa transmisje, lecz do buf1 i buf2 wpisuje te same wartosci - jedynie pierwsze 16b, ktore ADC zwraca. Dane odebrane zgadzaja sie z tym co widze na oscyloskopie, wiec teoretycznie mam te 16b, ale przydaloby sie uzyskac wieksza rozdzielczosc przetwornika...
Pewnie da sie to zrealizowac przy pomocy DMA, ale czy ktos ma pomysl jak uzyskac te 32b bez DMA.