10일이나 되었구나.....
하긴 그동안 주말도 있었고 비전을 이용한 작업을 하나 하는바람에 이쪽부분을 못한것도 있으니....
그래도 10일이나 지났다는걸 감안하면 상당한 시간동안 지체된건 분명한듯 하군.
사용된 코드는 stm32f4 discovery 보드와 withrobot의 myUSB2UArt 와 myAccel3lv02 rev.B 를 이용하였다.
void SPI_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB ,&GPIO_InitStruct);
SPI_I2S_DeInit(SPI2);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
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_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
/* Initializes the SPI communication */
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
}
// 통신함수
SPI2_WriteReadByte(0x8f);
sprintf(str, "Who Am I 2 is(111010) : %d\n ", SPI2_WriteReadByte(0x00) );
Serial_PutString(str);
// writeRead 함수
unsigned char SPI2_WriteReadByte(unsigned char Data)
{
while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
SPI1->DR = Data; //<--- 이곳이 문제
while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
return (SPI2->DR);
}
문제는 오실로 스코프로 찍어보았을 때 출력값이 두번씩 나온다는 것인데.....
이걸로 일단은 SPI 통신이 마무리된거네.
이번에는 분명한 내 실수였다.
그러나 이러한 작업을 하면서 SPI 통신에 대해서는 더 많이 이해한것 같다.