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

📄 usbiox.c

📁 USB2I2C USB2SPI USB2ISP资料开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
	if ( j && length != read_len ) j = FALSE;	if ( wr_buffer != buffer ) free( wr_buffer );  // 如果是分配的内存则释放	return( j );}// 向EEPROM中写入数据块// index: 指定USB2XXX设备序号// eeprom_id: 指定EEPROM型号// address: 指定数据单元的地址// length: 准备写出的数据字节数// buffer: 指向一个缓冲区,放置准备写出的数据unsigned char USB2XXX_write_eeprom( unsigned char index, EEPROM_TYPE eeprom_id, unsigned long address, unsigned long length, unsigned char *buffer ){	unsigned long len;	unsigned char write_buffer[256];	if(eeprom_id >= ID_24C01 && eeprom_id <= ID_24C16)	{		while(length)		{			write_buffer[0]=(unsigned char)(0xA0 | (address >> 7) & 0x0E);			write_buffer[1]=(unsigned char)address;			len=eeprom_id >= ID_24C04 ? 16- (address & 15) : 8-(address & 7);			if(len > length)len = length ;			memcpy( &write_buffer[2], buffer, len );						if( USB2XXX_stream_i2c( index, 2+len, write_buffer, 0 ,NULL) == FALSE )				return (FALSE);			USB2XXX_set_delays( index, 10 );			address += len;			length -= len;			buffer += len;		}	}	else if( eeprom_id >= ID_24C32 && eeprom_id <= ID_24C4096)	{		while(length)		{			write_buffer[0] = (unsigned char)( 0xA0 | (address >> 15) &0x0E);			write_buffer[1] = (unsigned char)( address >> 8);			write_buffer[2] = (unsigned char)address;			len = eeprom_id >= ID_24C512 ? 128 - ( address & 127 ) : ( eeprom_id >= ID_24C128 ? 64 - ( address & 63 ) : 32 - ( address & 31 ) );			if( len > length )len = length;			memcpy( &write_buffer[3], buffer, len);			if( USB2XXX_stream_i2c( index, 3+len, write_buffer, 0 ,NULL) == FALSE )				return (FALSE);			USB2XXX_set_delays( index, 10 );			address += len;			length -+ len;			buffer += len; 		}	}		else	return(FALSE);	return(TRUE);}// 从EEPROM中读取数据块,速度约56K字节// index: 指定USB2XXX设备序号// eeprom_id: 指定EEPROM型号// address: 指定数据单元的地址// length: 准备读取的数据字节数// buffer: 指向一个缓冲区,返回后是读入的数据unsigned char USB2XXX_read_eeprom( unsigned char index, EEPROM_TYPE eeprom_id, unsigned long address, unsigned long length, unsigned char *buffer ){	unsigned long len;	unsigned char write_buffer[4];	if(eeprom_id >= ID_24C01 && eeprom_id <= ID_24C16)	{		while(length)		{			write_buffer[0] = (unsigned char)(0xA0 | (address >> 7) & 0x0E);			write_buffer[1] = (unsigned char)address;			len	= min( length , mDEFAULT_BUFFER_LEN);			if( USB2XXX_stream_i2c( index, 2, write_buffer, len , buffer) == FALSE )				return (FALSE);			address += len;			length -= len;			buffer += len;		}	}	else if( eeprom_id >= ID_24C32 && eeprom_id <= ID_24C4096)	{		while(length)		{			write_buffer[0] = (unsigned char)( 0xA0 | (address >> 15) &0x0E);			write_buffer[1] = (unsigned char)( address >> 8);			write_buffer[2] = (unsigned char)address;			len = min( length , mDEFAULT_BUFFER_LEN);			memcpy( &write_buffer[3], buffer, len);			if( USB2XXX_stream_i2c( index, 3, write_buffer, len, buffer) == FALSE )				return (FALSE);			address += len;			length -+ len;			buffer += len; 		}	}		else	return(FALSE);	return(TRUE);}// 处理SPI数据流,支持准双向单入单出/3线接口、单入单出/4线接口、双入双出/5线接口// index: 指定USB2XXX设备序号// chip_select: 片选控制, 位7为0则忽略片选控制, 位7为1则参数有效: 位1位0为00/01/10分别选择D0/D1/D2引脚作为低电平有效片选// length: 准备传输的数据字节数// buffer: 指向一个缓冲区,放置准备从SDO写出的数据,返回后是从SDI读入的数据// buffer2: 指向双入双出5线接口的第二缓冲区,为1则为单入单出4线接口模式,为0则为SIO准双向3线接口模式unsigned char USB2XXX_stream_spix( unsigned char index, unsigned long chip_select, unsigned long length, unsigned char *buffer, unsigned char * buffer2 ){	unsigned char m_buffer[mDEFAULT_BUFFER_LEN];	unsigned long i, j, m_length, m_select, m_count;	unsigned char	*m_write_buffer;	unsigned char c1, c2;	if( length > mMAX_BUFFER_LENGTH ) return FALSE;	if( length <= mDEFAULT_BUFFER_LEN/2 )m_write_buffer=m_buffer;	else	{		m_write_buffer = malloc( mMAX_BUFFER_LENGTH );		if( m_write_buffer ==NULL ) return FALSE;	}	i=0;	if( chip_select & 0x80 )//片选控制	{		m_write_buffer[i++] = mUSBIOA_CMD_UIO_STREAM;		switch( chip_select & 0x03 )		{			case 0x00: m_select = 0x36; break;			case 0x01: m_select = 0x35; break;			case 0x02: m_select = 0x33; break;			default: m_select = 0x27; break;		}		m_write_buffer[i++] = ( unsigned char )mUSBIOA_CMD_UIO_STM_OUT | m_select;			m_write_buffer[i++] = ( unsigned char )mUSBIOA_CMD_UIO_STM_DIR | 0x3F;		m_write_buffer[i++] = mUSBIOA_CMD_UIO_STM_END;		i=mUSBIO_PACKET_LENGTH;	}	if( length )	{		if( (unsigned long)buffer2 < 4 )//单入单出		{			for( j=0; j<length; )	//用户要求写的字节数			{				m_write_buffer[i++] = buffer2 ? mUSBIOA_CMD_SPI_STREAM : mUSBIOA_CMD_SIO_STREAM;				m_length = mUSBIO_PACKET_LENGTH-1;				if( m_length > length - j )m_length = length - j;				if( sUSBIO[ index ].USBIO_stream_mode & 0x80 )//高位在前				{					while( m_length-- )m_write_buffer[i++] = msb_table[ *( (unsigned char *)buffer + j++ ) ];				}				else while( m_length--) m_write_buffer[i++] = *( (unsigned char *)buffer + j++ );//低位在前							if( i % mUSBIO_PACKET_LENGTH == 0)				{					m_write_buffer[i] = m_write_buffer[i+1] = 0;					i += mUSBIO_PACKET_LENGTH;				}			}		}		else//双入双出		{			for(j=0;j<length;)			{				m_write_buffer[i++] = mUSBIOA_CMD_SPI_STREAM;				m_length = mUSBIO_PACKET_LENGTH-1;				if( m_length > length-j )m_length = length-j;				if( sUSBIO[ index].USBIO_stream_mode & 0x80)				{						while(m_length--)//复制数据					{						c1=msb_table[ *( (unsigned char *)buffer + (j>>1) )];						c2=msb_table[ *( (unsigned char *)buffer2 + (j>>1) )];						m_write_buffer[i++] = (unsigned char) ( (j&0x01) ? (c1 & 0xF0 | c2>>4 & 0xF0) : (c1 << 4 & 0xF0 | c2 & 0xF0 ) );						j++; 							}				}				else//低位在前				{					while(m_length--)//复制数据					{						c1 = *( (unsigned char *)buffer + (j>>1) );						c2 = *( (unsigned char *)buffer2 + (j>>1) );						m_write_buffer[i++] = (unsigned char) ( (j&0x01) ? (c1 & 0xF0 | c2>>4 & 0xF0) : (c1 << 4 & 0xF0 | c2 & 0xF0 ) );						j++; 							}				}				if( i % mUSBIO_PACKET_LENGTH == 0)				{					m_write_buffer[i] = m_write_buffer[i+1] = 0;					i += mUSBIO_PACKET_LENGTH;				}			}		}	}	m_length=0;	j = USB2XXX_write_read( index, i, m_write_buffer, mUSBIO_PACKET_LENGTH-1, ( length + mUSBIO_PACKET_LENGTH-1-1 )/( mUSBIO_PACKET_LENGTH-1),	&m_length, (unsigned long)buffer2 < 4 ? buffer : m_write_buffer );	if( j && m_length != length)	j = FALSE;	if(m_write_buffer != m_buffer)free(m_write_buffer);	if( chip_select & 0x80)	{		m_buffer[0]=mUSBIOA_CMD_UIO_STREAM;		m_buffer[1]=(unsigned char)( mUSBIOA_CMD_UIO_STM_OUT | 0x37);		m_buffer[2]=mUSBIOA_CMD_UIO_STM_END;		m_length=3; 		if( USB2XXX_write_data( index, m_buffer, m_length ) )		{			if(m_length<2)return(FALSE);		}		else return(FALSE);	}	if(j)	{		if( (unsigned long)buffer2<4 )		{			if( sUSBIO[index].USBIO_stream_mode & 0x80 )			{				for(i=0;i<length;i++)					m_write_buffer[i++]=msb_table[ *( (unsigned char *)buffer+j++ ) ];//复制数据			}		}		else		{			for(i=0;i<length;i+=2)			{					c1=m_write_buffer[i];				c2=m_write_buffer[i+1];				if( sUSBIO[ index ].USBIO_stream_mode & 0x80)				{					*( (unsigned char *) buffer +(i>>1)) = msb_table[c1>>4 & 0x0F | c2& 0xF0];					*( (unsigned char *) buffer2 +(i>>1)) = msb_table[c1 & 0x0F | c2<<4 & 0xF0];				}				else				{					*( (unsigned char *) buffer +(i>>1)) = (unsigned char)c1>>4 & 0x0F | c2& 0xF0;					*( (unsigned char *) buffer2 +(i>>1)) = (unsigned char)c1 & 0x0F | c2<<4 & 0xF0;				}			}		}	}	return(j);}// 处理SPI数据流,4线接口://					时钟线为DCK/D3引脚;//					输出数据线为DOUT/D5引脚;//					输入数据线为DIN/D7引脚;//					片选线为D0/D1/D2,速度约110K字节.// SPI时序: DCK/D3引脚为时钟输出, 默认为低电平; //					DOUT/D5引脚在时钟上升沿之前的低电平期间输出;//					DIN/D7引脚在时钟下降沿之前的高电平期间输入.//操作成功 失败返回0// index: 指定USB2XXX设备序号// chip_select: 片选控制, 位7为0则忽略片选控制, 位7为1则参数有效: 位1位0为00/01/10分别选择D0/D1/D2引脚作为低电平有效片选// length: 准备传输的数据字节数// buffer: 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据unsigned char USB2XXX_stream_spi4( unsigned char index, unsigned long chip_select, unsigned long length, unsigned char * buffer ){		if( sUSBIO[ index ].USBIO_stream_mode & 0x40 )			if( USB2XXX_set_stream( index, sUSBIO[ index ].USBIO_stream_mode & 0xFB ) == FALSE )				return FALSE;		return ( USB2XXX_stream_spix( index, chip_select, length, buffer, (unsigned char *)1) );}void select_test( usb_dev_handle *USB2XXX_dev ){	unsigned char	inputr;	unsigned char a;	unsigned char read_buffer[256]="";	unsigned char write_buffer[256]="";	unsigned char i;	printf("--------------------------------------------------------\	      \n    USB2XXX: USB TO ISP LIB TEST PROGRAM  v%s  (GPL)		\	      \n            <C> Enci Liang  @  usb-i2c-spi@hotmail.com	\	      \n            Welcom to visit http://www.usb-i2c-spi.com  \	      \n                          LastBuild: %s,%s\	      \n--------------------------------------------------------\n", VERSION, __TIME__, __DATE__);	do{		printf("Please select test function...   \n");		printf("1- USB2XXX_read_eeprom\n");		printf("2- USB2XXX_write_eeprom\n");			printf("3- USB2XXX_spi4\n");		printf("4- USB2XXX_open\n");		printf("5- USB2XXX_close\n");		printf("6- exit\n");	again:			inputr = getchar( );		if( inputr == 10) goto again;			switch( inputr )		{			case '1':				USB2XXX_read_eeprom( 0, 3, 0, 0x20, read_buffer);					for(i=0; i<0x20; i++)					{						printf("read_buffer[%d]=%d\n",i,read_buffer[i]);					}						break;				case '2':					for( i=0; i<0x20; i++)					{						write_buffer[ i ] = 0x55;					}					USB2XXX_write_eeprom( 0, 3, 0, 0x20, write_buffer);					break;				case '3':					for( i=0; i<0x10; i++)					{						write_buffer[ i ] = 0xAA;					}					USB2XXX_stream_spi4( 0, 0x80, 0x10, write_buffer );					break;				case '4':					break;				case '5':					break;				case '6':					USB2XXX_close( USB2XXX_dev );					exit(1);					break;		}	}while( 1 );}   //测试int main(int argc, char *argv[]){	usb_dev_handle *USB2XXX_dev;	if( !USB2XXX_init( ) )printf("Not find USB2XXX device!\n");	USB2XXX_dev = USB2XXX_open(0);	select_test( USB2XXX_dev );}

⌨️ 快捷键说明

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