Ejemplo n.º 1
0
void SSTCmd2(u8 cmd,u8 data)
{
	SST_SELECT();
	SPIByte(cmd);
	SPIByte(data);
	SST_DESELECT();
}
Ejemplo n.º 2
0
/****************************************
**函数名:SSTCmdb1b/SSTCmd4bs
**功能:写一个SST命令,返回1字节数据/写1个命令字,3个地址字,返回多个字节
**注意事项:
****************************************/
u8 SSTCmdb1b(u8 cmd)
{
	u8 tmp;
	SST_SELECT();
	SPIByte(cmd);
	tmp=SPIByte(0xff);
	SST_DESELECT();
	return(tmp);
}
Ejemplo n.º 3
0
void SSTCmd4(u8 cmd,u8 *addr)
{
	SST_SELECT();
	SPIByte(cmd);	//首命令
	SPIByte(*addr++);
	SPIByte(*addr++);
	SPIByte(*addr);
	SST_DESELECT();
}
Ejemplo n.º 4
0
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();
}
Ejemplo n.º 5
0
/*************************************
  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();
}
Ejemplo n.º 6
0
/***********************************
  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保护
}
Ejemplo n.º 7
0
/**********************************
  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());
}
Ejemplo n.º 8
0
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);
}
Ejemplo n.º 9
0
/***********************************************
**函数名: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();
}
Ejemplo n.º 10
0
/***********************************
  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();
}
Ejemplo n.º 11
0
void LCD_WriteCmd(u8 cmd)
{
	CSLCDS_L;
	A0_L;
//	__nop();
//	__nop();
	SPIByte(cmd);
//	__nop();
//	__nop();
	CSLCDS_H;
}
Ejemplo n.º 12
0
void LCD_WriteData(u8 dat)
{	
	CSLCDS_L;
	A0_H;
//	__nop();
//	__nop();
	SPIByte(dat);
//	__nop();
//	__nop();
	CSLCDS_H;
}
Ejemplo n.º 13
0
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);	//复位总线
}
Ejemplo n.º 14
0
/********************************************************
**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;
	}
}
Ejemplo n.º 15
0
//返回串行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;
	}
}
Ejemplo n.º 16
0
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);
}
Ejemplo n.º 17
0
/*****************************************
**函数名:SSTCmd1/2/4
**功能:写一个SST命令/写一个命令后接一个数据/写一个命令后再写3个数据
**注意事项:这是一个完整的单命令操作,不返回
*****************************************/
void SSTCmd1(u8 cmd)
{
	SST_SELECT();
	SPIByte(cmd);
	SST_DESELECT();
}