|
富士通FM3官方RT-Thread操作系统下SPI驱动问题
[复制链接]
我在富士通FM3官方板上移植了RT-Thread操作系统下。目前SPI驱动程序遇到一些问题。上来求教。
首先,SPI驱动程序中发送已经正常,用逻辑分析仪看,发送数据、片选、SCK都正常。但在接收程序中出现问题。接收程序如下
uint16_t SPI_ReceiveData(struct rt_serial_device *serial)
{
uint8_t reg_smr;
uint8_t reg_scr;
uint8_t reg_ssr;
uint16_t reg_data;
int t=0;
ENC28J60_CS_LOW();
for(t=0;t<10;t++);
reg_smr = FM3_MFS0_CSIO->SMR | (SMR_SOE) | (SMR_SCKE);
FM3_MFS0_CSIO->SMR = reg_smr;
/* rx interrupt enable, rx enable */
reg_scr = FM3_MFS0_CSIO->SCR | (SCR_RIE | SCR_RXE);
FM3_MFS0_CSIO->SCR = reg_scr;
reg_ssr = FM3_MFS0_CSIO->SSR;
if ((reg_ssr & (SSR_RDRF)) != 0)
{
/* Return the data in the DR register */
reg_data = FM3_MFS0_CSIO->RDR;
}
else
{
/* overrun error */
/* clear rx error interrupt */
reg_ssr |= SSR_REC;
FM3_MFS0_CSIO->SSR = reg_ssr;
reg_data = -1;
}
/* rx interrupt disable, rx disable */
reg_scr = FM3_MFS0_CSIO->SCR & ~(SCR_RIE | SCR_RXE);
FM3_MFS0_CSIO->SCR = reg_scr;
/* serial output disable */
for(t=0;t<10;t++);
ENC28J60_CS_HIGH();
return reg_data;
}
测试调用代码为:
while(1)
{
SPI_SendData(serial_spi, 0xaf);
i = SPI_ReceiveData(serial_spi);
SPI_SendData(serial_spi, 0xa5);
i = SPI_ReceiveData(serial_spi);
SPI_SendData(serial_spi, 0x0a);
}
目前接收不到数据。用逻辑分析仪查看,接收数据期间,片选CS正常,但没有SCK时钟。单步调试时发现数据溢出。即下面的代码中没有执行读取RDR中数据。
if ((reg_ssr & (SSR_RDRF)) != 0)
{
/* Return the data in the DR register */
reg_data = FM3_MFS0_CSIO->RDR;
}
else
{
/* overrun error */
/* clear rx error interrupt */
reg_ssr |= SSR_REC;
FM3_MFS0_CSIO->SSR = reg_ssr;
reg_data = -1;
}
根据逻辑分析仪查看的结果,我认为是因为没有SCK原因造成的。求教发送期间为什么没有SCK?
|
|