写入 NOP 寄存器00ABCD
---- 读取 NOP 寄存器80ABCD
---- 读取 NOP 寄存器800000
---- 读取 NOP 寄存器800000
??误差
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
写入 NOP 寄存器00ABCD
---- 读取 NOP 寄存器80ABCD
---- 读取 NOP 寄存器800000
---- 读取 NOP 寄存器800000
??误差
FPGA Nios II
SPI 模式1
SPI CLK 1MHz
//------ 写入 NOP ---
ADDR = 0x00;
数据= 0xabcd;
isWrite = 1;
RET = pkgCmd (addr、data、isWrite);
printf ("写NOP寄存器%06X\n"、(unsigned int) ret);
TX_DATA_ARRAGE[0]= RET;
RX_DATA_ARRAGE[0]= 0x000000;
SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
//-------- 从 NOP 读取---
isWrite = 0;
地址= 0x00;//μ s
RET = pkgCmd (addr、data、isWrite);
TX_DATA_ARRAGE[0]= RET;
RX_DATA_ARRAGE[0]= 0x000000;
SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
printf ("------ 读 NOP 寄存器%06X\n"、(无符号整型)(Rx_DATA_ARRAGE[0]);
/**
* SPIWrite 功能
*
void SPI_OLED_WR (alt_u32* TX_DATA、alt_u32* Rx_DATA、int len){
WIFI_SPI_COMMAND_PC (SPI_CTRL_CARD_BASE、0、len、TX_DATA、len、 RX_DATA、0);
/* alt_Avalon SPI_COMMAND (SPI_CTRL_CARD_BASE、0、
len、TX_DATA、len、Rx_DATA、0);*/
}
;
//封装 CMD
alt_u32 pkgCmd (alt_u8 addr、alt_U16 data、int isWrite){
alt_u32 ret = 0x000000;
RET =(addr << 16)| DATA;//8 + 16 = 24位 Ω
if (isWrite = 1){
写操作 最高位置0 μ s
RET = RET & 0x7ffff;
}否则{
//读操作 最高位置1 1000 0000 ff ff ff ff ff ff
RET = RET | 0x800000;
}
回程;
};
///------------------------ SPI func-------------------------------------------------------
/*********
**
*许可协议*
*作者:PC
* pcjiushizhu@qq.com
秘书长的报告 /
#include "alt_types.h"
#include "wifi SPI_base.h"
#include "altera_Avalon SPI_regs.h"
#include "altera_Avalon PIO_regs.h"
#include "io.h"
#include "system.h"
#include // usleep()
#define READ_NOW
#define delay 1.
int wi_spi_command_pc (alt_u32 base、alt_u32 slave、
alt_u32 write_length、alt_u32 * write_data、
alt_u32 read_length、alt_u32 * read_data、
alt_u32标志)
{
const alt_u32 * write_end = write_data + write_length;
alt_u32状态;
/*警告:如果在多线程中调用此函数,则当前不安全
*环境中、以上内容必须执行锁定、以确保安全(如果更安全)
*一个线程打算使用它。
*
IOWR_Altera_Avalon SPI_SLAVE_SEL (base、1 << slave);
/*仅当切换标志未设置时才设置 SSO 位(强制芯片选择)*/
如果((flags & ALT_Avalon SPI_COMMAND_TOGGLE_SS_N)=0){
IOWR_Altera_Avalon SPI_CONTROL (base、Altera_Avalon SPI_CONTRAL_SSO_MSK);
}
,增加同步操作,同步线操作,拉高同步头,主程序没有改。2016.5.5 μ s
IOWR (PIO_SYNC_BASE、0、0x01);
/*
*如果 RXDATA 寄存器中存在过时的数据、请将其丢弃
*之前的通信中断,并且保留了过时的数据
* Behind 清空rx
*
IORD_32DIRECT (base、0);
/*保持计时,直到所有数据都被处理。 *
对于(;;){
//------ 发送数据--------
执行{
读SPI的status寄存器= IORD_8DIRECT (base、8);//μ s
0则等待 while ((status & 0x40)!= 0x40);//TRDY = 1表示txdata寄存器空,可以发起新的一次写入,μ s TRDY =μ s
{
if (write_data < write_end){
IOWR_32DIRECT (base、4、(* write_data));
write_data++;
}
}
// usleep(10);//如果优化级别高了,就需要延时了。
//------ 紧接着接收数据------
执行{
读SPI的status寄存器= IORD_8DIRECT (base、8);//μ s
0则等待 while ((status & 0x80)!= 0x80);//RRDY= 1表示rxdata寄存器满,可供读取,Ω RRDY=Ω
{
alt_u32 rxdata = IORD_32DIRECT (base、0);
(* read_data)= rxdata;
Read_data++;
如果(WRITE_DATA == WRITE_END)
中断;
}
// usleep(10);//如果优化级别高了,就需要延时了。
}
/*等待接口完成传输*/
操作
{
状态= IORD_Altera_Avalon SPI_STATUS (基本);
}
while ((status & Altera_Avalon SPI_STATUS_TMT_MSK)=0);
/*清除 SSO (释放芯片选择),除非调用方要执行此操作
*继续使用此芯片
*
如果((flags & ALT_Avalon SPI_COMMAND_merge)=0){
// int i=1000,j=1000;
// for (i=1000;i>0;i--){
//// for (j=1000;j>0;j--){
///;
////}
//}
IOWR_Altera_Avalon SPI_CONTROL (base、0);
// usleep(5);
}
同步线操作,拉低同步头 μ s
IOWR (PIO_SYNC_BASE、0、0x00);
返回 READ_LENGTH;
}
1读;
1.将要读回的寄存器地址写入 NOP
//------ 写入 NOP ---
ADDR = 0x00;
数据= 0xabcd;
isWrite = 1;
RET = pkgCmd (addr、data、isWrite);
printf ("写NOP寄存器%06X\n"、(unsigned int) ret);
TX_DATA_ARRAGE[0]= RET;
RX_DATA_ARRAGE[0]= 0x000000;
SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
2.虚拟读取周期;从先前设置的地址读回数据
//-------- 从 NOP 读取---
isWrite = 0;
地址= 0x00;//μ s
RET = pkgCmd (addr、data、isWrite);
TX_DATA_ARRAGE[0]= RET;
RX_DATA_ARRAGE[0]= 0x000000;
SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
printf ("------ 读 NOP 寄存器%06X\n"、(无符号整型)(Rx_DATA_ARRAGE[0]);
二读;
重复上述步骤1和2
第3读;
重复上述步骤1和2
请在您的代码中尝试上述序列。
谢谢