在用stm8s的spi发送中断方式来与flash存储器配合读写数据,在接收数据时,第一个接收到的字节总是莫名为0xff?有时候还会漏收字节?请大家指正是哪里有问题?
spi的发送中断里,完成发送和接收数据的处理:
@far @interrupt void SPI_IRQHandler(void)
{
if (SPI->SR & SPI_FLAG_RXNE)
{
if(SPI_pointer_Tx > SPI_Order_Len)
{
tempbuffer_rx[SPI_pointer_Rx++] = (u8)SPI->DR;
//while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);
}
}
if (SPI->SR & SPI_FLAG_TXE)
{
if (SPI_pointer_Tx < SPI_TDLen)
{
SPI->DR = tempbuffer[SPI_pointer_Tx++];
if(SPI_pointer_Tx==SPI_TDLen)
{
GPIO_WriteHigh(GPIOG, GPIO_PIN_0);//置高CS }
}
else
{
SPI_ITConfig(SPI_IT_TXE, DISABLE);//缓冲区数据发送完成后,关闭中断,再次发送时打开
}
}
}
其中这句if (SPI->SR & SPI_FLAG_RXNE) 有的话,就会出现漏收,如果去掉的话就会漏收的字节出现了,但是会重复收到2次。
初始化程序如下:
void SPI_Initial(void)
{
/*push pull output for CLK, MOSI, pull up input for MISO */
GPIO_Init (GPIOC, GPIO_PIN_6 | GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_SLOW);
GPIO_Init (GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_IT );//FL不进SPI中断
GPIO_Init (GPIOG, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_SLOW );
GPIO_Init (GPIOG, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_SLOW );
/* SPI config */
SPI_DeInit();
/* Initialize SPI in Slave mode */
SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_16, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_HIGH,SPI_CLOCKPHASE_2EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,(u8)0);//为1edge,flash不回。
SPI_Cmd(ENABLE);
}
应用时:
比如我向flash里写如16个数据:
0x05 0x06 0x07 0x08 ........0x14 0x015
但是读回来的数据就是:
0xff 0x06 0x07 0x07b 0x08 x09 .................0x12 0x13
从读回来的数据里就可以看出,第一个字节多了一个0xff,但是却没有读到0x05,然后0x07读了2遍(if (SPI->SR & SPI_FLAG_RXNE) 有的话)。
其他命令时SPI也是表现多一个0xff,没分析出来是怎么回事?
看到spi的数据寄存器只有一个SPI_DR,是不是这个原因导致收的不及时?另外在通信时,我一直在用示波器监测数据,从示波器波形看,flash回的数据的波形正确,时序也是对的,看来就是芯片在接收时出现的问题,请大家帮助分析分析,到底是怎么回事?
挺着急的,肯请大家来分析!!指正!!!
此帖出自
小平头技术问答
一周热门 更多>