void SSTCmd2(u8 cmd,u8 data) { SST_SELECT(); SPIByte(cmd); SPIByte(data); SST_DESELECT(); }
/**************************************** **函数名:SSTCmdb1b/SSTCmd4bs **功能:写一个SST命令,返回1字节数据/写1个命令字,3个地址字,返回多个字节 **注意事项: ****************************************/ u8 SSTCmdb1b(u8 cmd) { u8 tmp; SST_SELECT(); SPIByte(cmd); tmp=SPIByte(0xff); SST_DESELECT(); return(tmp); }
void SSTCmd4(u8 cmd,u8 *addr) { SST_SELECT(); SPIByte(cmd); //首命令 SPIByte(*addr++); SPIByte(*addr++); SPIByte(*addr); SST_DESELECT(); }
void SSTCmd4bs(u8 cmd,u8* addr,u8* data,u32 no) { SST_SELECT(); SPIByte(cmd); //首命令 SPIByte(*addr++); SPIByte(*addr++); SPIByte(*addr); for(;no>0;no--) { *data++=SPIByte(0xff); } SST_DESELECT(); }
/************************************* SST25Read 高速读 对于后续带5的芯片,可调用此函数读 *************************************/ void SST25Read(u32 addr,u8* p_data,u32 no) { SST_SELECT(); SPIByte(0x0b); SPIByte(addr>>16); SPIByte(addr>>8); SPIByte(addr); SPIByte(0xff); for(;no>0;no--) *p_data++=SPIByte(0xff); SST_DESELECT(); }
/*********************************** SST25Write 写多个字节 ***********************************/ void SST25Write(u32 addr,u8* p_data,u32 no) { u8 ad[3]; u32 cnt; if(no==0) return; SST25WriteEn(); if(no==1) //no<2则应使用普通单字节方式 { SST25ByteProgram(addr,*p_data); // SST25WPEN(); } else { cnt=no; ad[2]=(addr>>16)&0xff; ad[1]=(addr>>8)&0xff; ad[0]=addr&0xff; SST_SELECT(); SPIByte(0xad); SPIByte(ad[2]); SPIByte(ad[1]); SPIByte(ad[0]); SPIByte(*p_data++); SPIByte(*p_data++); SST_DESELECT(); cnt-=2; while(SST25BY());//判忙 //中间的双字节写 for(;cnt>1;cnt-=2) { SST_SELECT(); SPIByte(0xad); SPIByte(*p_data++); SPIByte(*p_data++); SST_DESELECT(); while(SST25BY());//判忙 } SST25WRDI();//WRDI用于退出AAI写模式 //如果有最后一个字节(no为奇数) if(cnt==1) { SST25WriteEn(); SST25ByteProgram(addr+no-1,*p_data); } } SST25WPEN();//WP保护 }
/********************************** SST25ByteProgram 写一个字节*注意在此前要调用取消写保护,实际写应使用AAI,此函数在AAI中调用,用于写奇数个字节 **********************************/ void SST25ByteProgram(u32 addr,u8 byte) { u8 ad[3]; ad[0]=(addr>>16)&0xff; ad[1]=(addr>>8)&0xff; ad[2]=addr&0xff; SST_SELECT(); SPIByte(0x02); SPIByte(ad[0]); SPIByte(ad[1]); SPIByte(ad[2]); SPIByte(byte); SST_DESELECT(); while(SST25BY()); }
void OpenLock(u8 LockId, u8 Numer) { u8 u8Remainder = LockId % 8; u8 u8Quotient = LockId / 8; u8 u8loop = Numer / 8; u8 i; if (LockId == 0xff) { u8Quotient = 0xff; } for(i = u8loop; i > 0; i--) { /* 第33 - 39、 41 - 47 路由于PCB布线问题,需要作以下调整。*/ /* 32 33 34 35 36 37 38 39 */ /* 32 39 38 37 36 35 34 33 */ //-- 实际被控制的线路 /* 40 41 42 43 44 45 46 47 */ /* 40 47 46 45 44 43 42 41 */ //-- 实际被控制的线路 if (i == u8Quotient+1) { if (u8Quotient+1 == 5 || u8Quotient+1 == 6) { if (u8Remainder != 0) { u8Remainder = 8 - u8Remainder; } } SPIByte(1<<u8Remainder); } else { SPIByte(0); } } __NOP(); GPIO_SetBits(GPIOB,GPIO_Pin_11); // for(i = 0;i<1000;i++) { __NOP(); } GPIO_ResetBits(GPIOB,GPIO_Pin_11); }
/*********************************************** **函数名:GetOneCoordinate **功能:获取一个坐标并放到指定的缓冲上 **注意事项:使用触摸管理后,唯一需要调动底层的就是这个函数,注意要把SPI状态转向触摸 ***********************************************/ void GetOneCoordinate(u8 no) { u16 tmp; SPI2TurnToTouch(); TOUCH_SELECT(); //__nop(); __NOP(); SPIByte(0xd0); __NOP(); tmp=SPIByte(0); tmp<<=8; tmp|=SPIByte(0); tmp>>=3; SPIByte(0x90); X_Buf[no]=tmp; tmp=SPIByte(0); tmp<<=8; tmp|=SPIByte(0); tmp>>=3; SPIByte(0xd0); Y_Buf[no]=tmp; TOUCH_DESELECT(); }
/*********************************** SST25SectorErase 刷扇区 ***********************************/ void SST25SectorErase(u32 addr) { u8 ad[3]; ad[0]=(addr>>16)&0xff; ad[1]=(addr>>8)&0xff; ad[2]=addr&0xff; SST25WriteEn(); SST_SELECT(); SPIByte(0x20); SPIByte(ad[0]); SPIByte(ad[1]); SPIByte(ad[2]); SST_DESELECT(); while(SST25BY()); // SST25WPEN(); }
void LCD_WriteCmd(u8 cmd) { CSLCDS_L; A0_L; // __nop(); // __nop(); SPIByte(cmd); // __nop(); // __nop(); CSLCDS_H; }
void LCD_WriteData(u8 dat) { CSLCDS_L; A0_H; // __nop(); // __nop(); SPIByte(dat); // __nop(); // __nop(); CSLCDS_H; }
void Spi2TurnToSST25(void) { u8 i; GPIO_SetBits(GPIOD, GPIO_Pin_2); GPIO_SetBits(GPIOD, GPIO_Pin_6); GPIO_SetBits(GPIOD, GPIO_Pin_13); FLASH_SPI_Config(); for(i=0;i<8;i++) SPIByte(0xff); //复位总线 }
/******************************************************** **SPI2转到触摸 ********************************************************/ void SPI2TurnToTouch(void) { if(Spi2_Mode!=SPI2_MODE_TOUCH) { SPI_Cmd(SPI2, DISABLE); SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL=1 时钟悬空高 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1 数据捕获第2沿 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //32M/16=2M SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2, ENABLE); TOUCH_DESELECT(); SPIByte(0xff); //复位总线 Spi2_Mode=SPI2_MODE_TOUCH; } }
//返回串行FLASH模式 void SPI1TurnToSST25(void) { if(Spi1_Mode!=SPI1_MODE_SST25) { SPI_Cmd(SPI2, DISABLE); //必须先禁能,才能改变MODE SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //CPOL=0 时钟悬空低 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //CPHA=0 数据捕获第1个 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //2分频 SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2, ENABLE); SST_DESELECT(); SPIByte(0xff); //复位总线 Spi1_Mode=SPI1_MODE_SST25; } }
void OpenLock(u8 * LockId,u8 Numer) { u32 i; for(i = 0;i<Numer;i++) { SPIByte(LockId[i]); } //SPIByte(LockId>>8); //SPIByte(LockId); __NOP(); GPIO_SetBits(GPIOB,GPIO_Pin_11); // for(i = 0;i<1000;i++) { __NOP(); } GPIO_ResetBits(GPIOB,GPIO_Pin_11); }
/***************************************** **函数名:SSTCmd1/2/4 **功能:写一个SST命令/写一个命令后接一个数据/写一个命令后再写3个数据 **注意事项:这是一个完整的单命令操作,不返回 *****************************************/ void SSTCmd1(u8 cmd) { SST_SELECT(); SPIByte(cmd); SST_DESELECT(); }