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

📄 spi_read_register.m

📁 MatLab图像传感器网络仿真平台WiSNAP
💻 M
字号:
function value = spi_read_register(port,address);
%Serial Peripheral Interface (4-wire SPI) register read.
%   VALUE = SPI_READ_REGISTER(PORT,ADDRESS);
%
%   Input Parameters:
%   ================
%
%      port --------------> Parallel port base address decimal (positive integer).
%      address -----------> Register address decimal (positive integer).
%
%   Output Parameters:
%   =================
%
%      value -------------> Register value decimal (positive integer).
%
%   See also SPI_WRITE_REGISTER.

% Stephan Hengstler
% Stanford Wireless Sensor Networks Lab
% January 06, 2005
%
% Last modified: 01-21-2005
% .MEX C Source: spi_read_register.c

%*********************** Serial Peripheral Interface Read Register ************************

% ** Parallel-to-SPI Adapter Configuration **
% -------------------------------------------
% ADNS-3060       Parallel Port Sub-D 25
% Pin   Name      Pin   SPP Name          Dir
% -------------------------------------------
%   1   NCS   ---  14   NAUTO-LINEFEED    OUT
%   2   MISO  ---  11   BUSY              IN
%   3   SCLK  ---   1   NSTROBE           OUT
%   4   MOSI  ---   2   DATA 0            OUT
%   6   RESET ---  16   NSELECT           OUT
%   7   NPD   ---  17   INITIALIZE        OUT
%  19   GND   ---  18   GROUND            N/A
% -------------------------------------------

% define port addresses
DATA_PORT   = port;
STAT_PORT   = DATA_PORT + 1;
CTRL_PORT   = DATA_PORT + 2;

% define signal bit masks
MASK_NCS    = 2;
MASK_NPD    = 3;
MASK_MOSI   = 1;
MASK_MISO   = 8;
MASK_RESET  = 4;
MASK_SCLK   = 1;

% set direction out
ctrl_value  = inp32(CTRL_PORT);
ctrl_value  = bitset(ctrl_value,6,0);

% raise chip select
ctrl_value     = bitset(ctrl_value,MASK_NCS,1);
out32(CTRL_PORT,ctrl_value)

% get data value
data_value	= inp32(DATA_PORT);

% address cycle
for bit = 8:-1:1

   % clear sclk
   ctrl_value     = bitset(ctrl_value,MASK_SCLK,1);
   out32(CTRL_PORT,ctrl_value)

   % place bit on mosi
   data_value		= bitset(data_value,MASK_MOSI,bitget(address,bit));
   out32(DATA_PORT,data_value)

   % raise sclk
   ctrl_value     = bitset(ctrl_value,MASK_SCLK,0);
   out32(CTRL_PORT,ctrl_value)

end

% insert delay per data sheet
% pause(75e-6)

% data cycle
value			= 0;
for bit = 8:-1:1
   
   % clear sclk
   ctrl_value     = bitset(ctrl_value,MASK_SCLK,1);
   out32(CTRL_PORT,ctrl_value)
   
   % sense bit from miso
   dummy 			= not(bitget(inp32(STAT_PORT),MASK_MISO));
   value				= bitset(value,bit,dummy);
   
   % raise sclk
   ctrl_value     = bitset(ctrl_value,MASK_SCLK,0);
   out32(CTRL_PORT,ctrl_value)
   
end

% clear chip select
ctrl_value     = bitset(ctrl_value,MASK_NCS,0);
out32(CTRL_PORT,ctrl_value)

⌨️ 快捷键说明

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