SPI로 data를 읽는데 Scope로 보는것과 읽어진값이 다릅니다.
Scope로 파형을 읽어보면 0x65가 보입니다. 그러나 uart로 확인해 보면 0x00이보이고 가끔은 0x65가 보일때도 있습니다. 문제가 뭔지 알수가 없습니다.
int main()
{
uint8_t i;
/* External Clock */
CRG_PLL_InputFrequencySelect(CRG_OCLK);
/* Set Systme init */
SystemInit();
GpioInit();
S_UART_Init(57600);
UART_StructInit(&UART_InitStructure);
/* Configure UART0 */
/* Retarget functions for GNU Tools for ARM Embedded Processors*/
/* Configure Uart0 Interrupt Enable*/
S_UART_ITConfig((UART_IT_FLAG_TXI|UART_IT_FLAG_RXI),ENABLE);
/* NVIC configuration */
NVIC_ClearPendingIRQ(UART2_IRQn);
NVIC_EnableIRQ(UART2_IRQn);
/* SysTick_Config */
SysTick_Config((GetSystemClock()/1000));
/* Set WZ_100US Register */
setTIC100US((GetSystemClock()/10000));
/* SSP0 Init -- SSP Master */
SSP_StructInit(&SSP0_InitStructure);
SSP0_InitStructure.SSP_SerialClockRate = 0; // 0 10 500KHz
SSP0_InitStructure.SSP_FrameFormat = SSP_FrameFormat_MO; // Motorora SPI mode
SSP0_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;
SSP0_InitStructure.SSP_CPOL = SSP_CPOL_Low;
SSP0_InitStructure.SSP_DataSize = SSP_DataSize_8b;
//SSP0_InitStructure.SSP_SOD = SSP_SOD_RESET;
SSP0_InitStructure.SSP_NSS = SSP_NSS_Hard;
SSP0_InitStructure.SSP_Mode = SSP_Mode_Master;
SSP0_InitStructure.SSP_BaudRatePrescaler = 40; // 40 about 500Khz
SSP_Init(SSP0,&SSP0_InitStructure);
i = read_eeprom(0x0005); // 실제값은 0x65가 있슴(scope로 확인함)
printf("r\n rd : %x", i); // 받아서 보면 값이 0x00이나옴 가끔 0x65가보일때도있슴)
}
void spi_out(byte data)
{
SSP_SendData(SSP0, data);
while( SSP_GetFlagStatus(SSP0, SSP_FLAG_BSY) );
}
byte spi_in(void)
{
byte data;
uint16_t retry=0;
GPIO_ResetBits(GPIOB, GPIO_Pin_3);
SSP_SendData(SSP0, 0xff);
while( SSP_GetFlagStatus(SSP0, SSP_FLAG_BSY) );
// 위 부분이 없으면 읽기도전에 chip select를 끝내고 나옴
retry = 10;
while (SSP_GetFlagStatus (SSP0, SSP_FLAG_RNE) == RESET);
data = (byte)SSP_ReceiveData(SSP0);
GPIO_SetBits(GPIOB, GPIO_Pin_3); //scope로 data읽는 시점을 보기위한 단자임
return data;
}
byte read_eeprom(word add)
{
byte data;
_EepCsLo();
spi_out(EepCmdRD);
spi_out((byte)(add >> 8));
spi_out((byte)(add & 0x00ff));
data = spi_in();
_EepCsHi();
return data;
}