|
本帖最后由 kanglei79 于 2013-7-9 09:20 编辑
如题,在写固件时老是写不进去,我用的是模拟spi,不知道是spi通信有问题,还是配置有问题,下面是我写的spi读写函数,请用过ADNS3080的朋友们来看看- void Write_A3080(unsigned char data0,unsigned char add)
- {
- unsigned char a_add[8];
- unsigned char a_data[8];
- char i;
- a_add[0]=1; //最高位置1,写操作
- a_add[1]=(add & 0x40)>>6;
- a_add[2]=(add & 0x20)>>5;
- a_add[3]=(add & 0x10)>>4;
- a_add[4]=(add & 0x08)>>3;
- a_add[5]=(add & 0x04)>>2;
- a_add[6]=(add & 0x02)>>1;
- a_add[7]=add & 0x01;
- for(i=0;i<8;i++)
- {
- SCLK_L;
- if(a_add[i])
- MOSI_H;
- else
- MOSI_L;
- SCLK_H;
- //SCLK=0;
- }
- //写数据
- a_data[0]=(data0 & 0x80)>>7;
- a_data[1]=(data0 & 0x40)>>6;
- a_data[2]=(data0 & 0x20)>>5;
- a_data[3]=(data0 & 0x10)>>4;
- a_data[4]=(data0 & 0x08)>>3;
- a_data[5]=(data0 & 0x04)>>2;
- a_data[6]=(data0 & 0x02)>>1;
- a_data[7]=data0 & 0x01;
- for(i=0;i<8;i++)
- {
- SCLK_L;
- if(a_data[i])
- MOSI_H;
- else
- MOSI_L;
- SCLK_H;
- //SCLK=0;
- }
- delay_100us();
- }
- unsigned char Read_A3080(unsigned char add)
- {
- char b_add[8];
- unsigned char i;
- unsigned char read_data;
- //写地址
- b_add[0]=0; //最高位置0,读操作
- b_add[1]=(add & 0x40)>>6;
- b_add[2]=(add & 0x20)>>5;
- b_add[3]=(add & 0x10)>>4;
- b_add[4]=(add & 0x08)>>3;
- b_add[5]=(add & 0x04)>>2;
- b_add[6]=(add & 0x02)>>1;
- b_add[7]=add & 0x01;
- for(i=0;i<8;i++)
- {
- SCLK_L;
- if(b_add[i])
- MOSI_H;
- else
- MOSI_L;
- SCLK_H;
- delay_100us();
- //SCLK=0;
- }
- delay_100us(); //delay>50us,3080准备数据
- //读数据
- for(i=0;i<8;i++)
- {
- SCLK_H;
- read_data=(read_data<<1) | MISO;
- SCLK_L;
- }
- delay_100us();
- return read_data;
-
- }
复制代码 下面是写固件部分:- void burst_mode_SROM(const unsigned char data0,unsigned char add)
- {
- unsigned char a_add[8]={0,0,0,0,0,0,0,0};
- unsigned char a_data[8]={0,0,0,0,0,0,0,0};
- static unsigned char aa=0;
- char i;
- a_add[0]=1; //最高位置1,写操作
- a_add[1]=(add & 0x40)>>6;
- a_add[2]=(add & 0x20)>>5;
- a_add[3]=(add & 0x10)>>4;
- a_add[4]=(add & 0x08)>>3;
- a_add[5]=(add & 0x04)>>2;
- a_add[6]=(add & 0x02)>>1;
- a_add[7]=add & 0x01;
-
- if(aa==0)
- {
- for(i=0;i<8;i++)
- {
- SCLK_L;
- if(a_add[i])
- MOSI_H;
- else
- MOSI_L;
- SCLK_H;
- //SCLK=0;
- }
- }
- delay_us(50);
- //写SROM
- a_data[0]=(data0 & 0x80)>>7;
- a_data[1]=(data0 & 0x40)>>6;
- a_data[2]=(data0 & 0x20)>>5;
- a_data[3]=(data0 & 0x10)>>4;
- a_data[4]=(data0 & 0x08)>>3;
- a_data[5]=(data0 & 0x04)>>2;
- a_data[6]=(data0 & 0x02)>>1;
- a_data[7]=data0 & 0x01;
- for(i=0;i<8;i++)
- {
- SCLK_L;
- if(a_data[i])
- MOSI_H;
- else
- MOSI_L;
- SCLK_H;
- //SCLK=0;
- }
- aa=1;
-
- }
- void Init_DownloadSROM(void)
- {
-
- NPD_L;
- NPD_H;
-
- RESET_H;
- delay_us(100);
- RESET_L;
-
- SCLK_H; //时钟空闲时上拉
- NCS_H;
- NCS_L;
- Write_A3080(0x44,0x22);
- Write_A3080(0x07,0x23);
- Write_A3080(0x88,0x24);
- delay_ms(1); //delay> 1 frame period
- Write_A3080(0x18,0x14); //使能SROM下载
- delay_us(100);
- }
- void downloadSROM(void)
- {
- unsigned int count; //A3080固件字节数
- Init_DownloadSROM();
- for(count=0;count<1986;count++)
- {
- burst_mode_SROM(SROM[count],0x60);
- }
- NCS_H;
- delay_us(100);
- }
复制代码 困扰我好几天了,万分感谢啊!!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|