改公司原来调好的一个板子,第一次调spi总线,遇到问题弄了两天了,没结果,请教一下大家。unsigned char SpiMasterIO(unsigned char HW_SPI_out) using SPI_REGISTER_BANK
{
unsigned char temp;
unsigned long tmp = 0;
SPDAT = HW_SPI_out;
do
{
temp = SPSTAT & SPI_INT_FLAG;
} while ((tmp < SPI_TIMEOUT)&&(temp != SPI_INT_FLAG));
SPSTAT = 0xc0;
return SPDAT;
}
SPI的发送程序如上面。依照STC的手册上修改的原来的程序,原来怎么也看不懂,这句SPSTAT = 0xc0;感觉把SPIF那一位置成1了,怎么上面还查询是1的时候标示发送完了,后来才弄明白,置1标示把SPIF清0了。当发送完8个脉冲数据后成了1,可以查询。
因为原来对Flash操作的程序是现成的,以为把下面的驱动改一下就可以了,后来写进片子后发现总是在Flash初始化的地方死机,经过调查后,发现死机的位置在下面的程序这里:
void FlashWaitBusy(void) using FLASH_REGISTER_BANK
{
unsigned long tmp_byte = 0;
while ( M_FLASH_COMMAND_TIMEOUT> tmp_byte)
{ // waste time until not busy
if((FlashRDSR() & M_FLASH_COMMAND_SR_BUSY) != M_FLASH_COMMAND_SR_BUSY)
{
if((FlashRDSR() & M_FLASH_COMMAND_SR_BUSY) != M_FLASH_COMMAND_SR_BUSY)
{
return;
}
}
tmp_byte++;
}
}
也就是在读Flash寄存器(发送0x05)后,不能返回值。用示波器看SCK和MOSI都是有波形的,MISO就是没有波形,硬件测量也没啥问题,郁闷 |