|
发表于 2015-4-20 19:24:45
|
显示全部楼层
本帖最后由 xyn0116 于 2015-4-20 20:18 编辑
楼主,我现在也是卡在固件下载这里,能读出PID,但是固件下载以后sromID和CRC校验的数值都很奇怪,分别是0xfe,0xff(lower),0xfe(upper)。。DS里说如果读PID可以用来验证串行通信是否成功,那么我读出PID是否就说明我的SPI口是可以正常读写的?那为什么我下载SROM就不对呢。。我注意到了你说的问题,把cs拉高拉低打包在了SPI发送接收函数中。。我的程序如下,可否帮我看一下哪里出错了呢:
SPI_MasterInit(); //initialize SPI port
ADNS_com_begin();
_delay_ms(100);
////Power Up ADNS9800(including the firmware download)/////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//1.Apply power to VDD5/VDD3 and VDDIO in any order
//2.Drive NCS high, and then low to reset the SPI port.
ADNS_com_end();
//3. Write 0x5a to Power_Up_Reset register (address 0x3a).
ADNS9800_SPI_transmit(REG_Power_Up_Reset, 0x5a);
//4. Wait for at least 50ms time.
_delay_ms(50);
/*5. Read from registers 0x02, 0x03, 0x04, 0x05 and 0x06 (or read these same 5 bytes from burst motion register) one time
regardless of the motion pin state. */
ADNS9800_SPI_read(REG_Motion);
ADNS9800_SPI_read(REG_Delta_X_L);
ADNS9800_SPI_read(REG_Delta_X_H);
ADNS9800_SPI_read(REG_Delta_Y_L);
ADNS9800_SPI_read(REG_Delta_Y_H);
//6. SROM download procedure begins////////////////////////////////////////////////////
//6.1 Select the 3 K bytes SROM size at Configuration_IV register, address 0x39
ADNS9800_SPI_transmit(REG_Configuration_IV, 0x02);
//6.2 Write 0x1d to SROM_Enable register for initializing
ADNS9800_SPI_transmit(REG_SROM_Enable, 0x1d);
//6.3 Wait for one frame
_delay_ms(10);
//6.4 Write 0x18 to SROM_Enable register again to start SROM downloading
ADNS9800_SPI_transmit(REG_SROM_Enable, 0x18);
/*6.5 Write SROM file into SROM_Load_Burst register, 1st data must start with SROM_Load_Burst register address. All the
SROM data must be downloaded before SROM start running.*/
ADNS_com_begin();
SPI_MasterTransmit(REG_SROM_Load_Burst|0x80);//first data
ADNS_com_end();
_delay_us(15);
unsigned char c;
ADNS_com_begin();
for(int i=0; i< firmware_length; i++)
{
c = (unsigned char)pgm_read_byte(firmware_data + i);
SPI_MasterTransmit(c);
_delay_us(15);
}
ADNS_com_end();
sromid = ADNS9800_SPI_read(REG_SROM_ID);
///perform crc test
//1. Write 0x15 to SROM_Enable register to start SROM CRC test.
ADNS9800_SPI_transmit(REG_SROM_Enable, 0x15);
//2. Wait for at least 10 ms.
_delay_ms(15);
//3. Read the CRC value from Data_Lower and Data_Upper registers.
datalower = ADNS9800_SPI_read(REG_Data_Out_Lower);
dataupper = ADNS9800_SPI_read(REG_Data_Out_Upper);
pid = ADNS9800_SPI_read(REG_Product_ID); |
|