色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ZYNQ開發(fā)案例之ZYNQ的UART加載

454398 ? 來源:FPGA技術聯(lián)盟 ? 作者:FPGA技術聯(lián)盟 ? 2020-12-05 10:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

加載方法

ZYNQ的啟動鏡像是由FSBL程序(bootloader),PL配置文件(硬件比特流文件),應用層軟件三個部分組成,其通過SDK的軟件生成工具把三個部分按規(guī)定的格式拼湊成一個.bin文件,最終將這個文件寫入到QSPIFLASH中,整個ZYNQ在配置好啟動方式為FLASH啟動后,便可做到上電自啟動運行下載到FLASH中的用戶程序。

為了實現(xiàn)遠程加載,拋開仿真器,通過UART的方式將固定的.bin文件發(fā)送給ZYNQ,然后將文件寫入到FLASH。其分三個步驟完成整個程序的更新:第一,搭建UART的傳輸,通過規(guī)定的握手協(xié)議,PC機將.bin文件以串口的形式發(fā)送給ZYNQ;第二,ZYNQ將收到的文件存儲在指定的DDR3內存當中;第三,ZYNQ將DDR3中的文件數(shù)據(jù)寫入到FLASH,寫完以后在讀出來與接收的數(shù)據(jù)作對比,做一個校驗。

串口交互形式

1. 開啟PC機加載程序,等待任務機發(fā)送加載信號

2. ZYNQ上電后第一時間給UART發(fā)送加載信號0xee,隨后監(jiān)測UART上的回應信號;

3. PC機監(jiān)測UART上的加載信號,若是0xee,則發(fā)送回應信號0xab,表示PC機做好了進入加載的準備,若不是0xee則不會發(fā)送回應信號;

4. ZYNQ收到回應信息0xab以后,進入加載流程,發(fā)送獲取長度指令信號0xcc給PC機;

5. PC機監(jiān)測UART上的獲取長度指令信號,若是0xcc,則發(fā)送數(shù)據(jù)總包數(shù)n給PC機(長度=128*n);

6. ZQNY收到數(shù)據(jù)長度數(shù)據(jù)后,發(fā)送應答信號0xaa給PC機,表示接收到數(shù)據(jù)長度了;

7. PC機監(jiān)測UART上的應答信號,接收到應答信號0xaa后,PC機進入發(fā)送數(shù)據(jù)流程,監(jiān)測ZYNQ的準備好接收數(shù)據(jù)信號0xdd;

8. ZYNQ接收完數(shù)據(jù)長度以后,發(fā)送準備好接收數(shù)據(jù)信號0xdd給PC機;

9. PC機監(jiān)測UART上的準備好接收數(shù)據(jù)信號0xdd,收到準備好信號0xdd信號以后,發(fā)送一包數(shù)據(jù)(128byte)給ZYNQ,發(fā)送完了以后又監(jiān)測準備好信號0xdd,然后又發(fā)送一包數(shù)據(jù)(128byte)給ZYNQ,往復循環(huán),直到數(shù)據(jù)包發(fā)送完,發(fā)送完數(shù)據(jù)后監(jiān)測數(shù)據(jù)接收完信號0xbb;

10. ZYNQ接收完數(shù)據(jù)后,發(fā)送接收完信號0xbb給PC機;

11. PC機監(jiān)測數(shù)據(jù)接收完信號0xbb;收到接收完信號0xbb后,數(shù)據(jù)交互流程完成,ZYNQ監(jiān)測FLASH寫入操作完成信號;

12. ZYNQ將接收到的數(shù)據(jù)寫入到FLASH,寫入完了以后發(fā)送FLASH寫入操作完成信號0xaf給PC機;

13. PC機監(jiān)測到接收完成信號0xaf后,提示用戶寫flash操作完成;進入到監(jiān)測FLASH數(shù)據(jù)校驗階段;

14. ZYNQ寫完flash后,將對應數(shù)據(jù)從flash中讀出來做校驗,校驗成功則發(fā)送校驗完成信號0xcf給PC機,若校驗失敗則發(fā)送失敗信號0xef給PC機;

15. PC機監(jiān)測到校驗完成信號或者校驗失敗信號后提示用戶校驗完成,整個加載程序完成。

交互流程如圖1所示。

UART與QSPI讀寫函數(shù)的設計

Uart初始化流程

1. 通過uart設備ID找到對應的外設信息;

2. 填充uart外設寄存器基地址和一些相關信息;

3. uart外設自檢;

4. 配置uart的fifo的觸發(fā)等級;

5. 使能uart外設;

源碼如下

void Init_Uart(void)
{
   XUartPs_Config *UartConifgPtr;
   s32 temp;
   //find device
UartConifgPtr = XUartPs_LookupConfig (XPAR_PS7_UART_1_DEVICE_ID);
   //config xuartps data struct
XUartPs_CfgInitialize(&Uart_1,UartConifgPtr, UartConifgPtr->BaseAddress);
   //self test
   temp = XUartPs_SelfTest(&Uart_1);
   if(temp != XST_SUCCESS)
   {
       return;
   }
// XUartPs_SetDataFormat(&Uart_1,XUARTPS_FORMAT_EVEN_PARITY);
   //set uart fifo level
   XUartPs_SetFifoThreshold(&Uart_1,8);
   //uart enable
   XUartPs_EnableUart(&Uart_1);
}

Uart接收字節(jié)函數(shù)

判斷RX的FIFO是否為空,如果處于空的狀態(tài),一直等待;如果不為空,讀取RX的FIFO里面的數(shù)據(jù),源碼如下:

u8 Uart_RecvByte(void)
{
u8 byte = 0;
while((((XUartPs_ReadReg(InstancePtr->Config.BaseAddress,XUARTPS_SR_OFFSET)) & 0x02) == 0x02));
byte = XUartPs_ReadReg(InstancePtr->Config.BaseAddress,XUARTPS_FIFO_OFFSET);
return byte;
}

Uart發(fā)送字節(jié)函數(shù)

判斷TX的FIFO是否滿,如果處于滿的狀態(tài),一直等待;如果未滿,則把需要發(fā)送的數(shù)據(jù)寫入到TX的FIFO中,源碼如下:

void Uart_SendByte(u8 byte)
{
while((((XUartPs_ReadReg(InstancePtr->Config.BaseAddress,XUARTPS_SR_OFFSET)) & 0x10) == 0x10));
XUartPs_WriteReg(InstancePtr->Config.BaseAddress,XUARTPS_FIFO_OFFSET,byte);
}

初始化QSPI流程

1. 通過qspi設備ID找到對應的外設信息;

2. 填充qspi外設寄存器基地址和一些相關信息;

3. Qspi外設自檢;

4. 配置qspi的工作模式;

5. 配置qspi的工作頻率;

6. 配置qspi的為從設備選擇;

源碼如下:

void Init_Qspi(void)
{
XQspiPs_Config *QspiConfig;
//find device
QspiConfig = XQspiPs_LookupConfig(XPAR_XQSPIPS_0_DEVICE_ID);
//config XQspiPs data struct QspiInstance
XQspiPs_CfgInitialize(&QspiInstance, QspiConfig,QspiConfig->BaseAddress);
//self test
XQspiPs_SelfTest(&QspiInstance);
//set qspi option
XQspiPs_SetOptions(&QspiInstance,XQSPIPS_MANUAL_START_OPTION |XQSPIPS_FORCE_SSELECT_OPTION |XQSPIPS_HOLD_B_DRIVE_OPTION);
//set qspi clk
XQspiPs_SetClkPrescaler(&QspiInstance, XQSPIPS_CLK_PRESCALE_8);
//set slave select of qspi
XQspiPs_SetSlaveSelect(&QspiInstance);
}

Flash擦除函數(shù)流程

1. 根據(jù)需要寫入數(shù)據(jù)的大小判斷需要整片擦除還是扇區(qū)擦除;

2. 通過qspi接口將寫使能命令寫入到flash;

3. 通過qspi接口將寫命令和需要擦除的flash地址以及數(shù)據(jù)發(fā)送到flash;

4. 等待數(shù)據(jù)的傳輸完成;

函數(shù)源碼:

*/
WriteBuffer[COMMAND_OFFSET] = BULK_ERASE_CMD;
/*
* Send the bulk erase command; no receive buffer is specified
* since there is nothing to receive
*/
XQspiPs_PolledTransfer(QspiPtr, WriteBuffer, NULL,
BULK_ERASE_SIZE);
/*
* Wait for the erase command to the FLASH to be completed
*/
while (1) {
/*
* Poll the status register of the device to determine
* when it completes, by sending a read status command
* and receiving the status byte
*/
XQspiPs_PolledTransfer(QspiPtr, ReadStatusCmd,
FlashStatus,
sizeof(ReadStatusCmd));
/*

* If the status indicates the write is done, then stop

* waiting; if a value of 0xFF in the status byte is

* read from the device and this loop never exits, the

* device slave select is possibly incorrect such that

* the device status is not being read

*/

if ((FlashStatus[1] & 0x01) == 0) {
break;
}
}

return;

}

/*

* If the erase size is less than the total size of the flash, use

* sector erase command

*/

for (Sector = 0; Sector

/*

* Send the write enable command to the SEEPOM so that it can be

* written to, this needs to be sent as a seperate transfer

* before the write

*/

XQspiPs_PolledTransfer(QspiPtr, &WriteEnableCmd, NULL,

sizeof(WriteEnableCmd));

/*

* Setup the write command with the specified address and data

* for the FLASH

*/

WriteBuffer[COMMAND_OFFSET] = SEC_ERASE_CMD;

WriteBuffer[ADDRESS_1_OFFSET] = (u8)(Address >> 16);

WriteBuffer[ADDRESS_2_OFFSET] = (u8)(Address >> 8);

WriteBuffer[ADDRESS_3_OFFSET] = (u8)(Address & 0xFF);

/*

* Send the sector erase command and address; no receive buffer

* is specified since there is nothing to receive

*/

XQspiPs_PolledTransfer(QspiPtr, WriteBuffer, NULL,

SEC_ERASE_SIZE);

/*

* Wait for the sector erse command to the FLASH to be completed

*/

while (1) {

/*

* Poll the status register of the device to determine

* when it completes, by sending a read status command

* and receiving the status byte

*/

XQspiPs_PolledTransfer(QspiPtr, ReadStatusCmd,

FlashStatus,

sizeof(ReadStatusCmd));

/*

* If the status indicates the write is done, then stop

* waiting, if a value of 0xFF in the status byte is

* read from the device and this loop never exits, the

* device slave select is possibly incorrect such that

* the device status is not being read

*/

if ((FlashStatus[1] & 0x01) == 0) {

break;

}
}

Address += SECTOR_SIZE;
}
}

Flash寫入函數(shù)流程

1. 通過qspi接口將寫使能發(fā)送給flash;

2. 通過qspi接口將寫命令和需要寫入數(shù)據(jù)的flash地址以及數(shù)據(jù)發(fā)送到flash;

3. 等待數(shù)據(jù)傳輸完成;

源碼如下:

void FlashWrite(XQspiPs *QspiPtr, u32 Address, u32 ByteCount, u8 Command)

{

u8 WriteEnableCmd = { WRITE_ENABLE_CMD };

u8 ReadStatusCmd[] = { READ_STATUS_CMD, 0 }; /* must send 2 bytes */

u8 FlashStatus[2];

/*

* Send the write enable command to the FLASH so that it can be

* written to, this needs to be sent as a seperate transfer before

* the write

*/

XQspiPs_PolledTransfer(QspiPtr, &WriteEnableCmd, NULL,

sizeof(WriteEnableCmd));
/*

* Setup the write command with the specified address and data for the

* FLASH

*/

WriteBuffer[COMMAND_OFFSET] = Command;

WriteBuffer[ADDRESS_1_OFFSET] = (u8)((Address & 0xFF0000) >> 16);

WriteBuffer[ADDRESS_2_OFFSET] = (u8)((Address & 0xFF00) >> 8);

WriteBuffer[ADDRESS_3_OFFSET] = (u8)(Address & 0xFF);

/*

* Send the write command, address, and data to the FLASH to be

* written, no receive buffer is specified since there is nothing to
* receive
*/
XQspiPs_PolledTransfer(QspiPtr, WriteBuffer, NULL,
ByteCount + OVERHEAD_SIZE);
/*
* Wait for the write command to the FLASH to be completed, it takes
* some time for the data to be written
*/
while (1) {
/*
* Poll the status register of the FLASH to determine when it
* completes, by sending a read status command and receiving the
* status byte
*/
XQspiPs_PolledTransfer(QspiPtr, ReadStatusCmd, FlashStatus,
sizeof(ReadStatusCmd));
/*
* If the status indicates the write is done, then stop waiting,
* if a value of 0xFF in the status byte is read from the
* device and this loop never exits, the device slave select is
* possibly incorrect such that the device status is not being
* read
*/
if ((FlashStatus[1] & 0x01) == 0) {
break;
}
}
}

Flash讀函數(shù)流程

1. 判斷讀指令是普通讀指令還是其他的讀指令;

2. 根據(jù)判斷使用對應的讀指令,將對應指令和flash寫入到flash,并根據(jù)需要讀多少個數(shù)據(jù),寫入對應個無效數(shù)據(jù)到flash,以獲取flash中對應地址的數(shù)據(jù);

函數(shù)源碼如下:
void FlashRead(XQspiPs *QspiPtr, u32 Address, u32 ByteCount, u8 Command)
{

/*

* Setup the write command with the specified address and data for the

* FLASH

*/

WriteBuffer[COMMAND_OFFSET] = Command;

WriteBuffer[ADDRESS_1_OFFSET] = (u8)((Address & 0xFF0000) >> 16);

WriteBuffer[ADDRESS_2_OFFSET] = (u8)((Address & 0xFF00) >> 8);

WriteBuffer[ADDRESS_3_OFFSET] = (u8)(Address & 0xFF);

if ((Command == FAST_READ_CMD) || (Command == DUAL_READ_CMD) ||

(Command == QUAD_READ_CMD)) {

ByteCount += DUMMY_SIZE;

}

/*

* Send the read command to the FLASH to read the specified number

* of bytes from the FLASH, send the read command and address and

* receive the specified number of bytes of data in the data buffer

*/

XQspiPs_PolledTransfer(QspiPtr, WriteBuffer, ReadBuffer,

ByteCount + OVERHEAD_SIZE);
}

加載程序源碼

/*

* uart_flash.c

*/

#include "xuartps.h"

#include "xil_types.h"

#include "xparameters.h" /* SDK generated parameters */

#include "xqspips.h" /* QSPI device driver */

/////////////////////////////////////////////////////

#define UART_DEVICE_ID XPAR_PS7_UART_1_DEVICE_ID

#define HEAD_LEN 2
XUartPs Uart_1;

XUartPs *InstancePtr = &Uart_1;

int Data_Len = 0;

int Len_Count = 0;

int Data_Count = 0;

u8 Uart_ReadBuffer[128];

u8 Uart_WriteBuffer[128];

u8 ReadCMD[10];

u8 WriteHeadLen[HEAD_LEN] = {0xcc,0x55};

u8 WriteLenOver[HEAD_LEN] = {0xaa,0x55};

u8 WriteHeadData[HEAD_LEN] = {0xdd,0x55};

u8 WriteDataOver[HEAD_LEN] = {0xbb,0x55};

u8 WritePowerOn[HEAD_LEN] = {0xee,0x55};

u8 Uart_RecvByte(void);

void Uart_SendByte(u8 byte);

int Uart_SendBuffer(u8 *buff,int length);

void Init_Uart(void);

int find_Head(u8 *src,u8 *dst,u8 length);

void delay(u32 count);

#define USER_DDR_BASE_ADDR 0x3e000000

u32 DDR_Base_Addr = USER_DDR_BASE_ADDR;

///////////////////////////////////////////////////////

///////////////////////////////////////////////////////

#define QSPI_DEVICE_ID XPAR_XQSPIPS_0_DEVICE_ID

#define WRITE_STATUS_CMD 0x01

#define WRITE_CMD 0x02

#define READ_CMD 0x03

#define WRITE_DISABLE_CMD 0x04

#define READ_STATUS_CMD 0x05

#define WRITE_ENABLE_CMD 0x06

#define FAST_READ_CMD 0x0B

#define DUAL_READ_CMD 0x3B

#define QUAD_READ_CMD 0x6B

#define BULK_ERASE_CMD 0xC7

#define SEC_ERASE_CMD 0xD8

#define READ_ID 0x9F

#define COMMAND_OFFSET 0 /* FLASH instruction */

#define ADDRESS_1_OFFSET 1 /* MSB byte of address to read or write */

#define ADDRESS_2_OFFSET 2 /* Middle byte of address to read or write */

#define ADDRESS_3_OFFSET 3 /* LSB byte of address to read or write */

#define DATA_OFFSET 4 /* Start of Data for Read/Write */

#define DUMMY_OFFSET 4 /* Dummy byte offset for fast, dual and quadreads */

#define DUMMY_SIZE 1 /* Number of dummy bytes for fast, dual andquad reads */

#define RD_ID_SIZE 4 /* Read ID command + 3 bytes ID response */

#define BULK_ERASE_SIZE 1 /* Bulk Erase command size */

#define SEC_ERASE_SIZE 4 /* Sector Erase command + Sector address */

#define OVERHEAD_SIZE 4

#define SECTOR_SIZE 0x10000

#define NUM_SECTORS 0x100

#define NUM_PAGES 0x10000

#define PAGE_SIZE 256

#define PAGE_COUNT 16

#define TEST_ADDRESS 0x00000000//0x00055000

#define UNIQUE_VALUE 0x05

#define MAX_DATA PAGE_COUNT * PAGE_SIZE

void Init_Qspi(void);

void FlashErase(XQspiPs *QspiPtr, u32 Address, u32 ByteCount);

void FlashWrite(XQspiPs *QspiPtr, u32 Address, u32 ByteCount, u8 Command);

void FlashRead(XQspiPs *QspiPtr, u32 Address, u32 ByteCount, u8 Command);

int FlashReadID(void);

XQspiPs QspiInstance;

unsigned int Flash_Address = 0x000000;

u8 ReadBuffer[MAX_DATA + DATA_OFFSET + DUMMY_SIZE];

u8 WriteBuffer[PAGE_SIZE + DATA_OFFSET];

///////////////////////////////////////////////////////

int main(void)

{

int recv_count = 0,i = 0,j = 0,verify_flag = 0;

u8 tt;

Init_Uart();

Init_Qspi();

// recv start signal

delay(10000);

//1 send power on to pc

Uart_SendBuffer(WritePowerOn,1);

delay(10000);

//recv power on ack

ReadCMD[0] = Uart_RecvByte();

delay(10000);

//2,ack right goto load

if(ReadCMD[0] == 0xab)

{

//3,send get data_len to pc

Uart_SendBuffer(WriteHeadLen,1);

delay(1000);

//4,recv length

while(1)

{

if(Len_Count > 1)

{

//5,send len tran over to pc

Uart_SendBuffer(WriteLenOver,1);

//6,data_len option

Data_Len |= ReadCMD[0] << 8;

Data_Len |= ReadCMD[1];

break;

}

ReadCMD[Len_Count] = Uart_RecvByte();

Len_Count++;

}

//7,sent get data to pc

delay(100000);

while(1)

{

//send over data

if(Data_Count >= Data_Len)

{

// send data over to pc

Uart_SendBuffer(WriteDataOver,1);

break;

}

// send get data to pc

Uart_SendBuffer(WriteHeadData,1);

while(1)

{

//get data to buffer

Uart_ReadBuffer[recv_count] = Uart_RecvByte();

if(recv_count >= 127)

{

break;

}

recv_count++;

}

recv_count = 0;

//write ddr3

for(i = 0,DDR_Base_Addr = USER_DDR_BASE_ADDR + Data_Count * 128;i < 128;i++,DDR_Base_Addr++)

{

*(unsigned int *)DDR_Base_Addr = Uart_ReadBuffer[i];

}

Data_Count++;

}

//flash program

Flash_Address = 0x000000;

DDR_Base_Addr = USER_DDR_BASE_ADDR;

//erase

FlashErase(&QspiInstance,0x000000, Data_Len * 128);

//write flash

for(i = 0;i < (Data_Len * 128 / PAGE_SIZE + 1);i++)

{

for(j = 0;j < PAGE_SIZE;j++)

{

WriteBuffer[j + 4] = *(unsigned int *)(DDR_Base_Addr + PAGE_SIZE * i + j);

}

FlashWrite(&QspiInstance, Flash_Address,PAGE_SIZE,WRITE_CMD);

Flash_Address += PAGE_SIZE;

}

Uart_SendByte(0xaf);

//verify Data

Flash_Address = 0x000000;

DDR_Base_Addr = USER_DDR_BASE_ADDR;

for(i = 0;i < (Data_Len * 128 / PAGE_SIZE + 1);i++)

{

FlashRead(&QspiInstance, Flash_Address,PAGE_SIZE,READ_CMD);

Flash_Address += PAGE_SIZE;

for(j = 0;j < PAGE_SIZE;j++)

{

tt = *(unsigned int *)(DDR_Base_Addr + PAGE_SIZE * i + j);

if(ReadBuffer[j + 4] == tt)

{

verify_flag = 0;

}

else

{

verify_flag = 1;

}

}

}

if(verify_flag == 1)

{

Uart_SendByte(0xcf);

}

else

{

Uart_SendByte(0xef);

}

while(1)

{

}

}

else

{

print("author:660 dz!!/r/n");

print("timer:2019/3/13!!/r/n");

while(1)

{

}

}

return 0;

}

void Init_Uart(void)

{

XUartPs_Config *UartConifgPtr;

s32 temp;

//find device

UartConifgPtr = XUartPs_LookupConfig(XPAR_PS7_UART_1_DEVICE_ID);

//config xuartps data struct

XUartPs_CfgInitialize(&Uart_1,UartConifgPtr, UartConifgPtr->BaseAddress);

//self test

temp = XUartPs_SelfTest(&Uart_1);

if(temp != XST_SUCCESS)

{

return;

}

// XUartPs_SetDataFormat(&Uart_1,XUARTPS_FORMAT_EVEN_PARITY);

//set uart fifo level

XUartPs_SetFifoThreshold(&Uart_1,8);

//uart enable

XUartPs_EnableUart(&Uart_1);

}

u8 Uart_RecvByte(void)

{

u8 byte = 0;

while((((XUartPs_ReadReg(InstancePtr->Config.BaseAddress,XUARTPS_SR_OFFSET)) & 0x02) == 0x02));

byte = XUartPs_ReadReg(InstancePtr->Config.BaseAddress,XUARTPS_FIFO_OFFSET);

return byte;

}

void Uart_SendByte(u8 byte)

{

while((((XUartPs_ReadReg(InstancePtr->Config.BaseAddress,XUARTPS_SR_OFFSET)) & 0x10) == 0x10));

XUartPs_WriteReg(InstancePtr->Config.BaseAddress,XUARTPS_FIFO_OFFSET,byte);

}

int Uart_SendBuffer(u8 *buff,int length)

{

int i = 0;

for(i = 0;i < length;i++)

{

Uart_SendByte(buff[i]);

}

return i;

}

int find_Head(u8 *src,u8 *dst,u8 length)

{

int i = 0,ret = 0;

for(i = 0;i < length - 1;i++)

{

if((src[i] == dst[0]) && (src[i + 1] == dst[1]))

{

ret = 1;

}

}

return ret;

}

void delay(u32 count)

{

unsigned int i = 0;

for(i = 0;i < count;i++)

;

}

void Init_Qspi(void)

{

XQspiPs_Config *QspiConfig;

//find device

QspiConfig = XQspiPs_LookupConfig(XPAR_XQSPIPS_0_DEVICE_ID);

//config XQspiPs data struct QspiInstance

XQspiPs_CfgInitialize(&QspiInstance, QspiConfig,QspiConfig->BaseAddress);

//self test

XQspiPs_SelfTest(&QspiInstance);

//set qspi option

XQspiPs_SetOptions(&QspiInstance,XQSPIPS_MANUAL_START_OPTION |XQSPIPS_FORCE_SSELECT_OPTION |XQSPIPS_HOLD_B_DRIVE_OPTION);

//set qspi clk

XQspiPs_SetClkPrescaler(&QspiInstance, XQSPIPS_CLK_PRESCALE_8);

//set slave select of qspi

XQspiPs_SetSlaveSelect(&QspiInstance);

}

void FlashErase(XQspiPs *QspiPtr, u32 Address, u32 ByteCount)

{

u8 WriteEnableCmd = { WRITE_ENABLE_CMD };

u8 ReadStatusCmd[] = { READ_STATUS_CMD, 0 }; /* must send 2 bytes */

u8 FlashStatus[2];

int Sector;

/*

* If erase size is same as the total size of the flash, use bulk erase

* command

*/

if (ByteCount == (NUM_SECTORS * SECTOR_SIZE)) {

/*

* Send the write enable command to the FLASH so that it can be

* written to, this needs to be sent as a seperate transfer

* before the erase

*/

XQspiPs_PolledTransfer(QspiPtr, &WriteEnableCmd, NULL,

sizeof(WriteEnableCmd));

/*

* Setup the bulk erase command

*/

WriteBuffer[COMMAND_OFFSET] = BULK_ERASE_CMD;

/*

* Send the bulk erase command; no receive buffer is specified

* since there is nothing to receive

*/

XQspiPs_PolledTransfer(QspiPtr, WriteBuffer, NULL,

BULK_ERASE_SIZE);

/*

* Wait for the erase command to the FLASH to be completed

*/

while (1) {

/*

* Poll the status register of the device to determine

* when it completes, by sending a read status command

* and receiving the status byte

*/

XQspiPs_PolledTransfer(QspiPtr, ReadStatusCmd,

FlashStatus,

sizeof(ReadStatusCmd));

/*

* If the status indicates the write is done, then stop

* waiting; if a value of 0xFF in the status byte is

* read from the device and this loop never exits, the

* device slave select is possibly incorrect such that

* the device status is not being read

*/

if ((FlashStatus[1] & 0x01) == 0) {

break;

}

}

return;

}

/*

* If the erase size is less than the total size of the flash, use

* sector erase command

*/

for (Sector = 0; Sector < ((ByteCount / SECTOR_SIZE) + 1); Sector++) {

/*

* Send the write enable command to the SEEPOM so that it can be

* written to, this needs to be sent as a seperate transfer

* before the write

*/

XQspiPs_PolledTransfer(QspiPtr, &WriteEnableCmd, NULL,

sizeof(WriteEnableCmd));

/*

* Setup the write command with the specified address and data

* for the FLASH

*/

WriteBuffer[COMMAND_OFFSET] = SEC_ERASE_CMD;

WriteBuffer[ADDRESS_1_OFFSET] = (u8)(Address >> 16);

WriteBuffer[ADDRESS_2_OFFSET] = (u8)(Address >> 8);

WriteBuffer[ADDRESS_3_OFFSET] = (u8)(Address & 0xFF);

/*

* Send the sector erase command and address; no receive buffer

* is specified since there is nothing to receive

*/

XQspiPs_PolledTransfer(QspiPtr, WriteBuffer, NULL,

SEC_ERASE_SIZE);

/*

* Wait for the sector erse command to the FLASH to be completed

*/

while (1) {

/*

* Poll the status register of the device to determine

* when it completes, by sending a read status command

* and receiving the status byte

*/

XQspiPs_PolledTransfer(QspiPtr, ReadStatusCmd,

FlashStatus,

sizeof(ReadStatusCmd));

/*

* If the status indicates the write is done, then stop

* waiting, if a value of 0xFF in the status byte is

* read from the device and this loop never exits, the

* device slave select is possibly incorrect such that

* the device status is not being read

*/

if ((FlashStatus[1] & 0x01) == 0) {

break;

}

}

Address += SECTOR_SIZE;

}

}

void FlashWrite(XQspiPs *QspiPtr, u32 Address, u32 ByteCount, u8 Command)

{

u8 WriteEnableCmd = { WRITE_ENABLE_CMD };

u8 ReadStatusCmd[] = { READ_STATUS_CMD, 0 }; /* must send 2 bytes */

u8 FlashStatus[2];

/*

* Send the write enable command to the FLASH so that it can be

* written to, this needs to be sent as a seperate transfer before

* the write

*/

XQspiPs_PolledTransfer(QspiPtr, &WriteEnableCmd, NULL,

sizeof(WriteEnableCmd));

/*

* Setup the write command with the specified address and data for the

* FLASH

*/

WriteBuffer[COMMAND_OFFSET] = Command;

WriteBuffer[ADDRESS_1_OFFSET] = (u8)((Address & 0xFF0000) >> 16);

WriteBuffer[ADDRESS_2_OFFSET] = (u8)((Address & 0xFF00) >> 8);

WriteBuffer[ADDRESS_3_OFFSET] = (u8)(Address & 0xFF);

/*

* Send the write command, address, and data to the FLASH to be

* written, no receive buffer is specified since there is nothing to

* receive

*/

XQspiPs_PolledTransfer(QspiPtr, WriteBuffer, NULL,

ByteCount + OVERHEAD_SIZE);

/*

* Wait for the write command to the FLASH to be completed, it takes

* some time for the data to be written

*/

while (1) {

/*

* Poll the status register of the FLASH to determine when it

* completes, by sending a read status command and receiving the

* status byte

*/

XQspiPs_PolledTransfer(QspiPtr, ReadStatusCmd, FlashStatus,

sizeof(ReadStatusCmd));

/*

* If the status indicates the write is done, then stop waiting,

* if a value of 0xFF in the status byte is read from the

* device and this loop never exits, the device slave select is

* possibly incorrect such that the device status is not being

* read

*/

if ((FlashStatus[1] & 0x01) == 0) {

break;

}

}

}

void FlashRead(XQspiPs *QspiPtr, u32 Address, u32 ByteCount, u8 Command)

{

/*

* Setup the write command with the specified address and data for the

* FLASH

*/

WriteBuffer[COMMAND_OFFSET] = Command;

WriteBuffer[ADDRESS_1_OFFSET] = (u8)((Address & 0xFF0000) >> 16);

WriteBuffer[ADDRESS_2_OFFSET] = (u8)((Address & 0xFF00) >> 8);

WriteBuffer[ADDRESS_3_OFFSET] = (u8)(Address & 0xFF);

if ((Command == FAST_READ_CMD) || (Command == DUAL_READ_CMD) ||

(Command == QUAD_READ_CMD)) {

ByteCount += DUMMY_SIZE;

}

/*

* Send the read command to the FLASH to read the specified number

* of bytes from the FLASH, send the read command and address and

* receive the specified number of bytes of data in the data buffer

*/

XQspiPs_PolledTransfer(QspiPtr, WriteBuffer, ReadBuffer,

ByteCount + OVERHEAD_SIZE);

}

int FlashReadID(void)

{

int Status;

/*

* Read ID in Auto mode.

*/

WriteBuffer[COMMAND_OFFSET] = READ_ID;

WriteBuffer[ADDRESS_1_OFFSET] = 0x23; /* 3 dummy bytes */

WriteBuffer[ADDRESS_2_OFFSET] = 0x08;

WriteBuffer[ADDRESS_3_OFFSET] = 0x09;

Status = XQspiPs_PolledTransfer(&QspiInstance, WriteBuffer, ReadBuffer,RD_ID_SIZE);

if (Status != XST_SUCCESS) {

return XST_FAILURE;

}

return XST_SUCCESS;

}

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Zynq
    +關注

    關注

    10

    文章

    617

    瀏覽量

    48403
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1081

    瀏覽量

    49548
收藏 1人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • jf_213248991

評論

相關推薦
熱點推薦

ZYNQ進階:PL端UART 發(fā)送設計案例

ZYNQ進階之路2 中我們講解了PL端PWM呼吸燈的設計,本節(jié)我們講解PL端實現(xiàn)串口UART的發(fā)送設計; 首先新建一個串口發(fā)送的工程,工程建立在ZYNQ進階之路1中已經(jīng)講述,這里不再累述; 下面
的頭像 發(fā)表于 11-25 17:26 ?4046次閱讀
<b class='flag-5'>ZYNQ</b>進階:PL端<b class='flag-5'>UART</b> 發(fā)送設計案例

ZYNQ開發(fā)案例:GPIO的結構體系及使用案例

GPIO的結構體系 zynq的GPIO,分為兩種,MIO(multiuse I/O)和EMIO(extendable multiuse I/O)。 ZYNQ的GPIO由4個BANK組成,其體系結構
的頭像 發(fā)表于 12-09 11:41 ?4461次閱讀
<b class='flag-5'>ZYNQ</b><b class='flag-5'>開發(fā)案</b>例:GPIO的結構體系及使用案例

PYNQ案例(一):ZYNQ的PL與PS開發(fā)

上一期的學習中,我們系統(tǒng)性地介紹了PYNQ與ZYNQ地區(qū)別與聯(lián)系。PYNQ = Python + ZYNQ,即將ZYNQ部分功能的Python化,直接調用Python庫和FPGA硬件庫進行功能的
的頭像 發(fā)表于 12-25 14:11 ?9183次閱讀

PYNQ案例(二):ZYNQ與PYNQ的區(qū)別與聯(lián)系

方法,軟件編程模式與全功能的標準ARM處理SoC毫無二致。 與相關和不同的是,PYNQ = Python + ZYNQ,即將ZYNQ部分功能的Python化,直接調用Python庫和FPGA硬件庫進行功能
的頭像 發(fā)表于 12-25 14:15 ?6514次閱讀

Zynq Book來襲!!!!!!

) 的英國學者所著,為您詳細介紹 Xilinx? Zynq?-7000 All Programmable SoC。本書包含了 Zynq-7000 SoC 開發(fā)的方方面面,從硬件到軟件,從理論到實現(xiàn)
發(fā)表于 09-04 11:37

玩轉Zynq連載28——[ex50] 第一個Zynq系統(tǒng)工程“Hello Zynq

鏈接:https://pan.baidu.com/s/1XTQtP5LZAedkCwQtllAEyw提取碼:ld9c 1概述如圖所示,Zynq系統(tǒng)的PS部分有豐富的外設接口,常見的USB、UART
發(fā)表于 09-30 12:57

Zynq在非JTAG模式下的啟動配置流程

的 ARM 開發(fā)過程類似,區(qū)別就在于它是PS + PL 的架構,所以在啟動過程中,額外需要加載二進制 bit 流文件。Xilinx 將 Zynq 的啟動劃分為3個階段,從結構上看也是科學合理的。  總結
發(fā)表于 01-08 16:33

ZYNQ嵌入式系統(tǒng)的開發(fā)流程

部分的始發(fā)點。通過本次實驗我們將了解 ZYNQ 嵌入式系統(tǒng)的開發(fā)流程,熟悉 ZYNQ 嵌入式最小系統(tǒng)的搭建。本章包括以下幾個部分:1.1 簡介1.2 實驗任務1.3 硬件設計1.4 軟件...
發(fā)表于 10-27 07:50

ZYNQ學習筆記_ZYNQ簡介和Hello World

ZYNQ學習筆記_ZYNQ簡介和Hello WorldZYNQ介紹PS和PL的連接ZYNQ開發(fā)工具鏈在PS端編寫Hello World程序ZYNQ
發(fā)表于 12-22 19:11 ?10次下載
<b class='flag-5'>ZYNQ</b>學習筆記_<b class='flag-5'>ZYNQ</b>簡介和Hello World

ZYNQ的啟動流程

ZYNQ7000 SOC 芯片可以從 FLASH 啟動,也可以從 SD 卡里啟動, 本節(jié)介紹程序 FLASH 啟動的方法。Zynq7000 SOC 芯片上電后,最先運行的是ARM端系統(tǒng)(PS
的頭像 發(fā)表于 05-07 09:41 ?7607次閱讀

解析Zynq加載方式

因為在S6或者其他7系列的FPGA中,是有一套非常成熟的FPGA加載機制(Xilinx有很詳細的指導手冊),但是來到Zynq時代,這個方式變了。為什么呢?因為現(xiàn)在zynq上有ARM了,所有的
的頭像 發(fā)表于 05-09 10:53 ?4093次閱讀

ZYNQ 的啟動流程介紹

普通的 FPGA 一般是可以從 flash 啟動,或者被動加載,但是ZYNQ不行,ZYNQ必須PS端參與
的頭像 發(fā)表于 07-22 10:10 ?9082次閱讀

ZYNQ7020的PS端的基本開發(fā)流程

這篇文章記錄ZYNQ7020的PS端的基本開發(fā)流程,關于PL端的開發(fā)流程,參考之前文章,這里放個超鏈接。
的頭像 發(fā)表于 07-24 18:12 ?1.1w次閱讀

FPGAs,ZynqZynq MPSoC器件的特點

Zynq MPSoC是Zynq-7000 SoC(之后簡稱Zynq)的進化版本。Zynq是賽靈思發(fā)布的集成PL(FPGA)和PS設計的最早的一代產(chǎn)品。如圖2.1所示,在相對較高層次對比
的頭像 發(fā)表于 08-15 09:16 ?3304次閱讀

Xilinx Zynq小試FPGA開發(fā)流程

Xilinx Zynq系列是帶有ARM Cortex-A系列CPU核的FPGA,前幾年流落到二手市場上的“礦板”就以Zynq 7010為核心,可以說是最廉價的Zynq實驗平臺了。
的頭像 發(fā)表于 03-14 16:13 ?2866次閱讀
主站蜘蛛池模板: 中文字幕第12页 | 日本少妇18p | 色妺妺视频网 | 征服少妇柔佳系列 | 黄色成人毛片 | 国产免费91| 国产粉嫩高中无套进入 | 国产成人av一区二区三区在线观看 | 亚洲综合色av | 欧美天天性影院 | 丝袜视频在线观看 | jizz免费| 手机av永久免费 | 91超级碰 | 亚洲欧洲日本综合aⅴ在线 国语自产偷拍精品视频偷 午夜无码区在线观看 | 国产传媒在线播放 | 国产99久久久久久免费看农村 | 黄色1级毛片| 四虎地址8848精品 | 韩国三级国产 | 日韩少妇中文字幕 | 国产乱人伦app精品久久 | 国产视频在线观看网站 | 一个人看的www日本高清视频 | 在线欧美a | 丁香婷婷激情 | 国产午夜精品一区二区三区 | 麻豆人人妻人人妻人人片av | 一级黄色大片网站 | 一本大道熟女人妻中文字幕在线 | 99热8| 精品三级av无码一区 | 久久91精品国产91久久跳 | 亚洲国产精品av | 久久99成人 | 天天碰天天 | 国产91在线视频 | 亚洲人网站 | 手机看片99 | 四虎影库 | 92电影网午夜福利 | 性生交大片免费看l | 日韩黄色成人 | 天堂av中文字幕 | 美女裸奶100%无遮挡免费网站 | aaa一级黄色片 | 99久久婷婷国产综合精品青牛牛 | 怡春院在线视频 | 天堂а√在线中文在线新版 | 欧美一区二区三区免费在线观看 | 伊人婷婷在线 | 国产做a视频 | 中文字幕四区 | 性生交大片免费看女人按摩 | 欧美黄色一级片视频 | 91精品无人区麻豆 | 色屁屁ts人妖系列二区 | 成人乱码一区二区三区av66 | 亚洲一区自拍 | 欧美成人免费全部 | 国产成人av性色在线影院 | 91麻豆vodafone精品| 亚色在线视频 | 夜夜躁狠狠躁日日躁av麻豆 | 久久精品动漫一区二区三区 | 亚韩天堂色总合 | 国产伦精品一区二区三区在线观看 | 男人天堂五月天 | 浴室激情hd免费看 | 全国露性器r级最禁片 | 亚洲精品乱码久久久久久 | 国产精品99久久久久的智能播放 | 欧美激情精品久久久久久变态 | 欧美毛片在线观看 | 国产日产欧产美一二三区 | 国产精品天天在线午夜更新 | 欧美亚洲专区 | 狠狠色网站 | 九色视频在线免费观看 | 久久精品国产中国久久 | 污污小说在线观看 | 在线中文字幕一区 | 国产成人精品在线视频 | 国产综合图区 | 天天插美女 | 国产精品xx视频xxtv | 午夜男女无遮挡拍拍视频 | 久久久久这里只有精品 | 国产一区二区三区四区五区加勒比 | 97人人澡人人爽人人模亚洲 | 亚洲国产婷婷香蕉久久久久久 | 在线观看的av网址 | 亚洲mv高清砖码区2022伊甸园 | 欧美国产综合视频 | 91综合在线 | 少妇下蹲露大唇无遮挡 | 成人18aa黄漫免费观看 | 国产亚洲精品久久久久久青梅 | 亚洲激情视频 | 拍摄av现场失控高潮数次 | 日本国产乱弄免费视频 | 黑人日批视频 | av免费亚洲| 99色在线视频 | 国产成人精品999 | 高清黄色毛片 | 日本少妇爱做按摩xxxⅹ | 亚洲第一黄网 | 黑人巨大跨种族video | 一区二区免费视频 | 欧美性插动态图 | 国产制服av | 一级黄色大片在线观看 | 国产成人精品一区二三区 | 香蕉视频免费在线播放 | 久久国产一级 | 免费在线视频你懂的 | 亚洲乱强伦 | 青青偷拍视频 | 中文字幕在线观看视频一区 | 最新99热| 国产羞羞 | 日本啪啪网站 | 日本少妇翘臀啪啪无遮挡动漫 | 国产精品美女久久久久av爽 | 91视频网页| 永久免费无码网站在线观看 | 99热最新精品 | 国产良家自拍 | 91绿帽黑人系列一区 | 夫妻毛片| 日本videos多次高潮 | 草草影院网址 | 清纯粉嫩极品夜夜嗨av | 少妇精品无码一区二区免费视频 | 无码人妻人妻经典 | 在线观看香蕉视频 | 国产女人的高潮国语对白 | 黄色毛片a | 亚洲毛片网 | 久久日本三级韩国三级 | 日韩精品一区二区三区 | 色婷在线| av黄色软件 | 欧美天天性影院 | 老熟女毛茸茸浓毛 | 丁香花婷婷 | 国产一线二线在线观看 | 99re6在线视频精品免费 | 久久99精品久久久久久牛牛影视 | 亚洲国产黄色 | 色噜噜狠狠一区二区三区 | 婷婷成人基地 | 99热这| 国产精品久久久久9999 | 天堂网免费视频 | 日韩不卡在线观看 | 男人看片网站 | 91灌醉下药在线观看播放 | 91精品网 | 成人av在线看 | 日本特黄特刺激一级猛片 | 日日噜噜噜夜夜爽爽狠狠小说 | 国产精品国产三级国产专区53 | 亚洲精品性视频 | 51嘿嘿嘿国产精品伦理 | 国产va免费精品观看 | 国产精品99久久 | 韩国av毛片 | 四虎在线观看视频 | 久久视频免费观看 | 亚洲综合毛片 | 中文字幕一区二区三区精彩视频 | 欧美日韩一区二区三区自拍 | 92精品国产成人观看免费 | 夜色www国产精品资源站 | 91快播视频| 女同三级bd高清在线播放 | 色婷婷激婷婷深爱五月 | 国产三级国产精品国产普男人 | 国产一二在线 | 国产女人高潮大叫a毛片 | 亚洲精品无人区 | www.久久久久久久久 | 日韩视频 中文字幕 | 国产成人亚洲在线观看 | 天天插天天摸 | 日韩欧美一区二区三区久久婷婷 | 99精品视频免费版的特色功能 | 亚洲欧美日韩另类精品一区二区三区 | 又色又爽又黄的视频软件app | 超碰麻豆| 丰满少妇夜夜爽爽高潮水网站 | 欧美精品一级在线观看 | 国产精品久久久久久久久久直播 | 国产亚洲欧美一区二区三区 | 爽爽影院在线 | 国产精品无码a∨麻豆 | 欧美大片免费观看在线观看网站推荐 | 少妇中文字幕乱码亚洲影视 | 少妇性生活视频 | 四虎永久在线精品免费一区二区 | 美女被张开双腿日出白浆 | 人人射人人澡 | av动漫免费观看 | 国产精品国产三级国产普通 | 成人影片麻豆国产影片免费观看 | 中文字幕精品久久 | 欧美精品久久天天躁 | 嘴交的视频丨vk口舌视频 | 97视频在线免费播放 | 国产欧美一区二区精品久久 | 国产对白国语对白 | 亚洲国产成人av在线观看 | 美女黄色一级视频 | 骚av在线| 国产一区二区三区乱码 | 日韩av在线网站 | av网站免费在线播放 | 成人免费影视网站 | 99国产精品99久久久久久娜娜 | 精品一区二区三区免费 | 亚洲三级久久 | 日婷婷| 国产亚洲天堂网 | 亚洲丶国产丶欧美一区二区三区 | 极品少妇hdxx麻豆hdxx | 国产精品天天在线午夜更新 | 日韩午夜毛片 | 中文字字幕在线中文乱码范文 | 精品无码一区二区三区av | www在线看片 | 女教师~淫辱のavhd101 | 91丝袜呻吟高潮美腿白嫩在线观看 | 国产69精品久久久久久野外 | 国产精品免费视频二三区 | 四虎永久在线精品无码视频 | 国产精品内射后入合集 | 久久久国产精品一区 | 日韩欧美一区二区三区免费观看 | 成人午夜免费福利视频 | 午夜影院免费版 | 亚洲色av天天天天天天 | 天天操夜夜操夜夜操 | 成人韩免费网站 | 欧美性生交xxxxx久久久 | 日日弄天天弄美女bbbb | 在线看无码的免费网站 | 午夜三级在线 | 国产亚洲成av人片在线观看 | 免费看48女人真人毛片 | 2024av在线播放| 国产亚洲精品久久久久婷婷瑜伽 | 777奇米888色狠狠俺也去 | 久久爽久久爽久久av东京爽 | 成人影视在线播放 | 黄色av网站在线免费观看 | 精品久久一二三区 | 激情区| 久久黄色免费视频 | 国产亚洲精品无码成人 | 国产日韩欧美中文字幕 | 国产成人专区 | 美女国产网站 | 成人影视网址 | 久久国产精品日本波多野结衣 | 亚洲中文字幕无码av | 久热这里只有精品6 | 日本激情吻胸吃奶呻吟视频 | 一区二区三区不卡在线 | 小猪佩奇第七季中文免费版 | 露脸叫床粗话东北少妇 | 一级特黄少妇高清毛片 | 国产精品有限公司 | 毛片av免费 | 特级毛片在线大全免费播放 | 少妇mm被擦出白浆液视频 | 97视频在线免费播放 | 青青操影院| 欧美日韩一区二区三区在线观看视频 | 免费全黄无遮挡裸体毛片 | 爱性久久久久久久久 | 高清不卡一区二区三区 | 欧美日韩一区二区三区不卡视频 | 国产嫩草一区二区三区在线观看 | 一本色道久久综合亚洲精品 | 国语对白做受xxxxx在 | 日b视频免费 | 国产主播一区二区三区 | 无码人妻黑人中文字幕 | 中文在线天堂网 | 最新一区二区三区 | 午夜视频成人 | 17c国产精品 | 蜜桃视频在线观看污 | 色不卡 | 久久久99久久久国产自输拍 | 伊人影院中文字幕 | 精品99999 | 欧美性猛交99久久久久99按摩 | 天海翼视频在线观看 | 9l蝌蚪porny中文自拍 | 国产精品久久久久久久久久久久久久久久 | 男女做爰猛烈叫床爽爽免费网站 | 二个男人躁我疯狂吃奶视频 | 麻豆国产尤物av尤物在线观看 | 国产精品理人伦一区二区三区 | 国产香蕉97碰碰碰视频在线观看 | 国产精品入口夜色视频大尺度 | 日本成人a| 亚洲视频一区二区在线观看 | 欧洲少妇性喷潮 | 亚洲欧美成人一区二区在线电影 | 日本少妇bbwbbw精品 | www超碰久久com | 亚洲精品成人片在线观看精品字幕 | 国产免费看av | 欧美精品日韩精品 | а中文在线天堂 | 国产伦精品一区二区三区千人斩 | 涩涩综合 | 九九影院理论片私人影院 | tushy欧美激情在线观看 | 内射人妻无码色ab麻豆 | 女色综合| 人人爽人人爽人人 | 亚洲精品成人片在线观看精品字幕 | 东伊人一本东热 | av在线免费观看网址 | 精品免费看 | 国产三级视频 | 中文精品一区二区 | 神马老子午夜 | 欧产日产国产精品乱噜噜 | 国产区图片区小说区亚洲区 | 国产精品无码永久免费不卡 | 无码精品人妻一区二区三区湄公河 | 精品一区二区三区四区视频 | 亚洲自拍第三页 | 日韩精品一卡2卡3卡4卡乱码的功能 | 国产亚洲成av人片在线观黄桃 | 欧美亚洲国产一区二区三区 | 日日夜夜国产精品 | 日韩日比视频 | 亚洲啪啪 | 日免费视频 | 欧美怡红院免费全部视频 | 亚洲国产另类久久久精品网站 | 久久妇女 | 成人免费在线影院 | 国产乱人激情h在线观看 | 国产区日韩区欧美区 | 在线观看成人免费 | 日韩精品精品 | 激情综合色综合啪啪开心 | 老汉色av影院 | 欧洲一级黄 | 中文字幕日韩人妻不卡一区 | 欧美成人aa | 亚洲欧洲精品一区二区 | 久久久久成人片免费观看蜜芽 | 污网站在线播放 | 成人婷婷网色偷偷亚洲男人的天堂 | 一个色在线视频 | 永久免费未满男 | av大片网| 国产丶欧美丶日本不卡视频 | 伊人超碰| 久久一二三区 | 强制中出し~大桥未久在线 | 亚洲码欧美码一区二区三区 | 一本一本久久a久久精品综合小说 | 久久久久久97免费精品一级小说 | 成人高潮片 | 国产青青草视频 | 97精品国产手机 | 天堂亚洲2017在线观看 | 秋霞在线播放视频 | 欧美视频亚洲 | 日韩免费在线视频观看 | 久久国产精品久久久久 | 色淫av蜜桃臀少妇 | 欧美性猛交xxxx乱大交3 | 夜色88v精品国产亚洲 | 深爱五月综合网 | 久久中文字幕网 | 看特级黄色片 | 亚洲欧洲精品mv免费看 | 一本一道久久久a久久久精品91 | 日本精品人妻无码免费大全 | 国产精品久久久久久在线观看 | 亚洲免费黄色 | 日本阿v免费观看视频 | 欧美午夜精品久久久久久孕妇 | www香蕉视频| 成人91看片 | 多p混交群体交乱在线观看 多男一女一级淫片免费播放口 | 国内黄色一级片 | 少妇又色又紧又大爽又刺激 | 国产日韩精品一区二区 | 天天鲁在视频在线观看 | 波多野结衣av一区二区三区中文 | 激情国产一区二区三区四区小说 | 人妻少妇精品久久久久久 | 成年女人18级毛片毛片免费 | av理伦片 | 美国一级大黄一片免费中文 | 大肉大捧一进一出好爽动态图 | 污污内射在线观看一区二区少妇 | 超碰神马| 一区二区三区免费观看 | 极品嫩模高潮叫床 | 操操操插插插 | 国产99视频精品免视看7 | 日韩av无码中文字幕 | 久久九九精品99国产精品 | 欧美精品videosex极品 | 男女做爰猛烈叫床高潮的书 | 尤物视频免费在线观看 | 99色这里只有精品 | 91久久久色在线观看 | 国产精品久久久久久久一区探花 | 欧美精品1区2区 | 香港三级澳门三级人妇99 | 久一视频在线 | 欧美久久视频 | 免费在线黄色片 | 99在线精品免费视频 | 日本内射精品一区二区视频 | 国产精品国色综合久久 | 91色影院| 午夜免费成人 | 粗大的内捧猛烈进出在线视频 | 成年人黄视频 | 免费观看羞羞视频网站 | 又大又长粗又爽又黄少妇视频 | 欧美久操 | jizz免费| 7777精品久久久大香线蕉小说 | 欧美成人午夜免费视在线看片 | 精品人体无码一区二区三区 | 国产精品麻豆色哟哟av | 日韩av毛片 | 农村少妇野战xxx视频 | 国产女主播av在线 | 国产精品美女www爽爽爽 | 粉嫩av一区二区 | 国产成人欧美一区二区三区 | 最新色视频 | 亚洲一区二区在线 | 粉嫩欧美一区二区三区 | 成人妇女免费播放久久久 | 极品少妇一区二区 | 国产素人在线 | 亚洲免费区 | caopeng视频| 国产草草影院ccyycom | 免费不卡毛片 | 国产精品男女啪啪 | 亚洲第一免费 | 日本黄色免费网址 | 国产区高清| 黄色小说在线视频 | 少妇交换浪荡h肉辣文视频 少妇交换做爰中文字幕 | 污视频免费在线观看网站 | 一区二区三区回区在观看免费视频 | 973理论片235影院9 | 成人性生交大片免费看视频hd | 55夜色66夜色国产精品视频 | 国产91在线免费观看 | 日产精品久久久一区二区福利 | 天天av天天爽 | 久久久久久综合网 | 亚洲a∨无码一区二区三区 国产乱子伦精品免费女 | 五月婷婷在线视频 | 成人看片在线观看 | 久久视频精品在线 | 久久综合一区 | 日本一区二区在线视频 | 性高湖久久久久久久久免费 | 美女久久久久久久久久 | 欧美老肥婆性猛交视频 | av免费网址| 中文字幕在线看 | 人人操天天射 | 黄色av日韩| 亚洲久久视频 | 乱子伦一区二区 | 欧美三级午夜理伦三级 | 老女人综合网 | 在线观看的av网站 | 三级三级三级a级全黄公司的 | 无码高潮少妇毛多水多水 | 中文字幕日韩欧美 | 91精品啪在线观看国产线免费 | 久久久久久九九九 | jizz在线观看 | 无码精品一区二区三区免费视频 | 国产精品自在自线视频 | 国产人成看黄久久久久久久久 | 精品久久久久久久久久岛国gif | 国产主播福利 | 亚洲视频在线观看一区 | 国产av精国产传媒 | 国产精品久久久久久久久久久久午夜 | 夜夜夜夜操 | 日本孰妇毛茸茸xxxx | 尤物视频网站在线观看 | 欧美黑人性暴力猛交喷水 | 超碰在线人人干 | 黄色片毛片 | 国产精品国产精品国产专区不蜜 | 亚洲aⅴ一区二区 | 国产偷国产偷亚洲高清app | 在线中文字幕一区二区 | 六月综合| 国产精品免费视频二三区 | 亚洲成人av在线播放 | 少妇天天爽视频在线看网站 | 他也色在线 | 91国内 | 狠狠色丁香婷婷综合欧美 | 亚洲国产成人av在线观看 | 欧美一级成人 | 免费看网站在线观 | 免费福利在线观看 | 美女三级视频 | 99国产精 | 久久网免费 | 亚洲免费在线视频观看 | 996久久国产精品线观看 | 国产不卡毛片 | 五月婷婷天| 一本久久精品一区二区 | 日韩五月| 成人高清视频在线 | 成人国产片女人爽到高潮 | 福利一区二区视频 | 亚洲人成人网站在线观看 | 乖疼润滑双性初h | 久久精品中文字幕 | 丁香六月婷婷开心婷婷网 | 亚洲熟妇av一区二区三区宅男 | 国产特级毛片aaaaaa喷潮 | 最新不卡av | 国产精品亚洲视频 | 丰满少妇毛茸茸做性极端 | 18禁超污无遮挡无码免费游戏 | 真人作爱90分钟免费看视频 | 日韩二区在线 | 国产精品欧美激情在线播放 | 国产精视频 | 99精品久久久久久久 | 日本免费一区二区三区在线播放 | 看全黄大黄大色大片美女 | 日本亲与子乱ay中文 | 亚洲专区第一页 | 国产日韩欧美日韩 | 午夜视频体内射.com.com | 56pao国产成人免费视频 | 亚洲精品av久久久久久久影院 | 国产精品人人人人 | 免费国产在线麻豆网站 | 1区2区视频 | 国产一区二区在线视频观看 | 亚洲一区二区视频在线 | 91精品一区二区中文字幕 | yellow免费在线观看 | 成x99人av在线www | 免费a一级 | 成人在线午夜视频 | 亚洲视频网站在线观看 | 国产精品久久久一区二区三区网站 | 日韩精品一区二区中文字幕 | 免费成人一级片 | 国产在线观看免费麻豆 | 催眠调教艳妇成肉便小说 | 不卡的av片 | 18av在线播放 | 少妇紧身牛仔裤裤啪啪 | 国产女人高潮抽搐喷水免费视频 | 欧美日韩精品亚洲精品 | 伊人久久91 | 91视频国产免费 | 91国语对白 | 福利视频h| 丝袜足控一区二区三区 | 一区二区三区四区日韩 | 日韩中文字幕在线观看视频 | 夜夜春夜夜爽 | 国产成人综合精品 | 免费成人看片 | 亚洲免费在线观看视频 | 国产欧美在线观看不卡 | 中文字幕在线免费看线人 | 欧美国产综合欧美视频 | 黑人上司好猛我好爽中文字幕 | 免费看黄色的网址 | 国产爆乳无码av在线播放 | 成人婷婷网色偷偷亚洲男人的天堂 | 99国产热| 香港澳门三级做爰 | 国内自拍小视频 | 97国产精品人人爽人人做 | 日本精品中文字幕 | 啪啪拍网站 | 加勒比中文字幕无码一区 | 婷婷成人丁香五月综合激情 | 噼里啪啦在线高清观看免费 | 在线成人精品国产区免费 | 日韩精品91偷拍在线观看 | 熟妇丰满多毛的大隂户 | 亚洲欧美第一 | 插b内射18免费视频 亚洲欧美另类激情综合区 很黄很色60分钟在线观看 | 国产精品第1页 |

電子發(fā)燒友

中國電子工程師最喜歡的網(wǎng)站

  • 2931785位工程師會員交流學習
  • 獲取您個性化的科技前沿技術信息
  • 參加活動獲取豐厚的禮品