📄 usbiox.c
字号:
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 + -