⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psoc.c.bak

📁 psoc_usb的代码,用来小卡测试的.没事下下来
💻 BAK
字号:
/*
 * INVENTEC corporation (c)2007 all rights reserved. 
 * Description: PSoC driver for gladius
 *              
 * Update: 
 * Revision		Date       Author              Reason 	
 * ========		========== =================== ==================
 * 1.0.0		2007-11-22  Liu.Fang-dong(ED)  Create
 *
 * Known issues:None
 *
 * Support Chip:
 * CY8C27143		CY8C27243	CY8C27443	CY8C27543	CY8C27643
 * CY8C24123		CY8C24223	CY8C24423
 * CY8C22113		CY8C22213
 * CY8C21123		CY8C21223	CY8C21323
 * CY8C21234		CY8C21334	CY8C21434	CY8C21534	CY8C21634
 */


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

#include "fx2.h"
#include "fx2regs.h"
#include "absacc.h"
#include "serial.h"
#include "scmain.h"
#include "cmdlist.h"
#include "PSoC.h"

#ifndef __USE_USB__
#include "serial.h"
#endif

//vectors used by PSoc
xdata char* vector_init_1 = "110010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110111101110000000011111011110110000000001111001111100000111010111100111110010000001111111011110101000000001111101111010000000011111100111110111000000011111011111001001100001111101111101001000000111110111100000000100111111011111000000000001111101111111100010010111";
xdata char* vector_init_2 = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101000000001111110111100000000011011111011111000000000001111101111111100010010111";
xdata char* vector_init_3_3v = "11011110111000000001111101111010000000011111110111101010000000011111011110110000010001111101111100001010001111110111110011111100011111011111010001100001111101111111100010010111000000000000000000000011011110111000000001111101111010000000011111110111101010000000011111011110110000010001111101111100001100000111110111110011110101011111011111010001100001111101111011100010000111110111111110001001011100000000000000000000001101111011100000000111110111101000000001111111011110101000000001111101111011000001000111110111110000101000111111011111001111110011111101111101000110000111110111111110001001011100000000000000000000001101111011100000000111110111101000000001111111011110101000000001111101111011000001000111110111110000110000011111011111001111010001111101111101000110000111110111101110001000011111011111111000100101110000000000000000000000";
xdata char* vector_init_3_5v = "11011110111000000001111101111010000000011111110111101010000000011111011110110000010001111101111100001010001111110111110011111110011111011111010001100001111101111111100010010111000000000000000000000011011110111000000001111101111010000000011111110111101010000000011111011110110000010001111101111100001100000111110111110011110101011111011111010001100001111101111011100010000111110111111110001001011100000000000000000000001101111011100000000111110111101000000001111111011110101000000001111101111011000001000111110111110000101000111111011111001111111011111101111101000110000111110111111110001001011100000000000000000000001101111011100000000111110111101000000001111111011110101000000001111101111011000001000111110111110000110000011111011111001111010001111101111101000110000111110111101110001000011111011111111000100101110000000000000000000000";
xdata char* vector_checksum_setup_CY8C27xxx = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101000000000111110111100000000011111111011111000000000001111101111111100010010111";
//xdata char* vector_checksum_setup_CY8C21x23_24xxx = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101001000000111110111100000000011111111011111000000000001111101111111100010010111";
//xdata char* vector_checksum_setup_CY8C21x34 = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101100000000111110111110010011000011111011111010010000001111001111101010000000111110111100000000011111111011111000000000001111101111111100010010111";
//xdata char* vector_checksum_setup_CY8C22xxx = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101000100000111110111100000000011111111011111000000000001111101111111100010010111";
xdata char* vector_verify_setup = "110111101110000000011111011110110000000001111001111100000111010111100111110010000001111111011110101000000001111101111010000000011111100111110111000000011111011111001001100001111101111101001000000111110111100000000000111111011111000000000001111101111111100010010111";
xdata char* vector_ID_setup = "110111101110001000011111011100000000000101111101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101000000000111110111100000000011011111011111000000000001111101111111100010010111";
xdata char* vector_40zero = "0000000000000000000000000000000000000000";

//-----------------------------------------------------------------------------
//list for command
//-----------------------------------------------------------------------------
const struct command_name xdata psoc_cmd[] = {
	{"select", do_psoc_init},
	{"getchecksum", GetCheckSum},
	{"sgpiotest", SgpioTest},
	{"psocreset", PsocReset},
	{0, 0}
};

//-----------------------------------------------------------------------------
//extern function
//-----------------------------------------------------------------------------
extern int   mydef_strcasecmp(char *dst, char *src);
extern int (*lookup_command_func(struct command_name *pcmd,char * cmd_str))();
extern char *get_current_cmd(char * buff);
extern char *lookup_return_str(int ret_cmd);
extern int   lookup_return_val(struct command_param *pm, char * cmd_str);
extern struct command_list * add_to_retlist(char * cmd);
extern void (*fp_blinking)(BYTE);


int do_psoc_init()
{
     return RET_OK;    
}

int PsocReset(void)
{
	SETOUT_PD(0);
	PSOC_RESET(HIGH);
	EZUSB_Delay(1);
	PSOC_RESET(LOW);
	EZUSB_Delay(10);
	
	return RET_OK;
}

void PsocDelay(int count)
{
	int i = 0;
	for(i = 0; i < 5*count; i++)
	{	
	}
}

//*****************************************************************************
//  function name:     WriteBit()/ReadBit() 
//  description:       send only one bit to SDATA
//  return:            none
//  note :
//*****************************************************************************
void WriteBit(char p)
{
	p &= 0x01;
	
	if(0 == p)
		PSOC_DOUT(LOW);
	else
		PSOC_DOUT(HIGH);
}


BYTE ReadBit(void)
{
	return PSOC_DIN;
}


//*****************************************************************************
//  function name:     /Readbyte() 
//  description:       send/read a byte
//  return:            none
//  note :
//*****************************************************************************
BYTE ReadByte(void)
{
	BYTE returnValue = 0;
	BYTE tmp = 0;
	int n = 0;
	
	SET_DIN;
	EZUSB_Delay(1);
	
	for (n = 7; n >= 0;n--)
	{
		PSOC_CLK(HIGH);
		//PsocDelay(1);
		PSOC_CLK(LOW);
		//PsocDelay(1);
		returnValue |=( (tmp = ReadBit())<<n);
	}
	
	SET_DOUT;
	EZUSB_Delay(1);
	
	return returnValue;
}

//*****************************************************************************
//  function name:     WriteVector()
//  description:       send/read a byte
//  return:            none
//  note :
//*****************************************************************************
void WriteVector(char* vector)
{
	int n = 0;
	
	while (vector[n] != '\0')
	{
		PSOC_CLK(HIGH);
		WriteBit(vector[n]);
		PSOC_CLK(LOW);

		n++;		
	}
}

//*****************************************************************************
//  function name:	WaitSingle()
//  description:	wait the single given bye psoc that shows we can give next
//					vector or we can read back from psoc   							 
//  return:			none
//  note :
//*****************************************************************************
void WaitSingle(void)
{
	int delay = 100000;

	SET_DIN;
	EZUSB_Delay(1);
	
	//wait HIGH single
	while(delay--)
	{
		if(HIGH == ReadBit())
		{
			break;
		}
		else
		{
			PSOC_CLK(HIGH);
			PSOC_CLK(LOW);
		}
	}
	
	//wait LOW single
	delay = 100000;
	while(delay--)
	{
		if(LOW == ReadBit())
		{
			SET_DOUT;
			EZUSB_Delay(1);
			WriteVector(vector_40zero);
			break;
		}
		else
		{
			PSOC_CLK(HIGH);
			PSOC_CLK(LOW);
		}
	}
	
	SET_DOUT;
	EZUSB_Delay(1);
}


//*****************************************************************************
//  function name:     GetCheckSum() 
//  description:       Get psoc checksum 
//  return:            0 success -1 fail
//  note :
//*****************************************************************************
int GetCheckSum(void)
{
	BYTE psocId = 0;
	int checksum = 0;
	xdata char param[4];
	memset (param, '\0', sizeof (param));
	
	//input output init for psoc checksum
	SETOUT_PD(0);//RESET
	SETOUT_PD(1);//CLK
	SETOUT_PD(2);//DATA
	
	//clean the disturb caused by sgpio
	PSOC_CLK(LOW);
	PSOC_DOUT(LOW);
	PSOC_RESET(LOW);
		
	//3.3v pull, down for psoc, up for sgpio
	_3V_PULL_DOWN_ ;
	EZUSB_Delay(3);
	
	EA = 0;//disable interrupt
	
	//psoc init for psoc programme
	PSOC_RESET(HIGH);
	EZUSB_Delay(1);
	PSOC_RESET(LOW);
	
	WriteVector(vector_init_1);
	WaitSingle();
	EA = 1;//enable interrupt
	WriteVector(vector_init_2);
	WaitSingle();
	WriteVector(vector_init_3_3v);
	EZUSB_Delay(1);
	
	//for get psoc ID	
	WriteVector(vector_ID_setup);
	WaitSingle();
	WriteVector("10111111000");
	PSOC_CLK(HIGH);
	PSOC_CLK(LOW);
	ReadByte();
	PSOC_CLK(HIGH);
	PSOC_CLK(LOW);
	WriteVector("110111111001");
	PSOC_CLK(HIGH);
	PSOC_CLK(LOW);
	psocId = ReadByte();
	PSOC_CLK(HIGH);
	PSOC_CLK(LOW);
	WriteVector("1");
	
	switch(psocId)
	{
		case PSoC_CY8C27143_ID:
		case PSoC_CY8C27243_ID:
		case PSoC_CY8C27443_ID:
		case PSoC_CY8C27543_ID:
		case PSoC_CY8C27643_ID:
			WriteVector(vector_checksum_setup_CY8C27xxx);
			break;
/*	
		case PSoC_CY8C21123_ID:
		case PSoC_CY8C21223_ID:
		case PSoC_CY8C21323_ID:
		case PSoC_CY8C24123_ID:
		case PSoC_CY8C24223_ID:
		case PSoC_CY8C24423_ID:
			WriteVector(vector_checksum_setup_CY8C21x23_24xxx);
			break;
		case PSoC_CY8C21234_ID:
		case PSoC_CY8C21334_ID:
		case PSoC_CY8C21434_ID:
		case PSoC_CY8C21534_ID:
		case PSoC_CY8C21634_ID:
			WriteVector(vector_checksum_setup_CY8C21x34);
			break;
		case PSoC_CY8C22113_ID:
		case PSoC_CY8C22213_ID:
			WriteVector(vector_checksum_setup_CY8C22xxx);
			break;
*/
		default:
			break;
	}
	WaitSingle();
	WriteVector("10111111001");
	PSOC_CLK(HIGH);
	PSOC_CLK(LOW);
	checksum |= (ReadByte()<<8);
    
	PSOC_CLK(HIGH);
	PSOC_CLK(LOW);
	WriteVector("110111111000");
	PSOC_CLK(HIGH);
	PSOC_CLK(LOW);
	checksum |= ReadByte();
	
  sprintf(param," %04x",checksum);
  add_to_retlist(param);
    
	PSOC_CLK(HIGH);
	PSOC_CLK(LOW);
	WriteVector("1");

	return RET_DONE;
}





//=============================================================================-
//test sgpio
//=============================================================================-
int SgpioTest()
{
    
    int i = 0;
    int val = 0;
    int result = 0;
    BYTE tmp = 0;
    BYTE param[16];
    

    memset (param, '\0', sizeof (param));
    if (get_current_cmd(param)==NULL)
    {
            return RET_ERROR;
    }
    
    val = strtol(param,NULL,16);
    if (val > 0xfff || val <0 )
	{
            return RET_ERROR;
    }

	//input output init for sgpio
	SETOUT_PD(2);//START
	SETOUT_PD(3);//CLK
	SETOUT_PD(4);//DIN
	SETIN_PD(1);//DOUT
	
	//clean the disturb caused by psoc
	SGPIO_START(LOW);
	SGPIO_CLK(LOW);
	SGPIO_DIN(LOW);
	EZUSB_Delay(1);
	
	//3.3v pull, down for psoc, up for sgpio
	_3V_PULL_UP_ ;
	EZUSB_Delay(1);
  //EA = 0;    // disable 8051 interrupts
    
	//clear start
  SGPIO_START(LOW);
	for(i=0; i<8; i++)
	{
		SGPIO_CLK(HIGH);
		PsocDelay(1);
		SGPIO_CLK(LOW);
		PsocDelay(1);
	}

	//set start 1-0
	SGPIO_START(HIGH);
	SGPIO_CLK(HIGH);
	PsocDelay(1);
	SGPIO_CLK(LOW);
	PsocDelay(1);
	SGPIO_START(LOW);

	//set data
	for (i=0; i<12; i++) 
	{
			//PUT DATAOUT
    	if (val & (1<<i))
    	{
		    SGPIO_DIN(HIGH);
		    PsocDelay(1);
      }
      else
      {
		    SGPIO_DIN(LOW);
		    PsocDelay(1);
		  }
            
			SGPIO_CLK(HIGH);
			PsocDelay(1);
			SGPIO_CLK(LOW);
			PsocDelay(1);
    
      //GET DATAIN
      tmp = SGPIO_DOUT & 0x01;
      result |= (tmp<<i);
	}

  //clear start
	SGPIO_START(0);
	PsocDelay(1);
	for (i=0; i<8; i++) 
	{
		SGPIO_CLK(HIGH);
		PsocDelay(1);
		SGPIO_CLK(LOW);
		PsocDelay(1);
	}
	
  //EA = 1; // Enable 8051 interrupts

  sprintf(param,"(%bX)",result);
  add_to_retlist(param);
    
  return RET_DONE;    
}

//=============================================================================-
//do_psoc_entry
//=============================================================================-
int do_psoc_entry(char *cmd)
{
    int  (*cmd_func) ();
    int  ret=0;
        
    cmd_func=lookup_command_func(psoc_cmd,cmd);
    if (cmd_func!=NULL) 
    {
        ret=(*cmd_func)();
        return(ret);
    }
    return RET_ERROR;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -