📄 ms_frame.m
字号:
function imager = ms_frame(port);
%Mouse sensor frame capture.
% IMAGER = MS_FRAME(PORT);
%
% Input Parameters:
% ================
%
% port --------------> Parallel port base address decimal (positive integer).
%
% Output Parameters:
% =================
%
% imager ------------> Image array, 30x30 pixels, 6 bit grayscale (30x30x1 array).
%
% See also MS_POWER, MS_RESET.
% Stephan Hengstler
% Stanford Wireless Sensor Networks Lab
% January 07, 2005
%
% Last modified: 01-21-2005
% .MEX C Source: ms_frame.c
%****************************** Mouse Sensor Frame Capture ********************************
% define mouse sensor registers
MS_REG_FRAME_CAPTURE = hex2dec('13'); % Register: Frame capture.
MS_REG_PIXEL_BURST = hex2dec('40'); % Register: Pixel burst.
% define mouse sensor parameters
MS_IMG_WIDTH = 30; % Image array: Width.
MS_IMG_HEIGHT = 30; % Image array: Height.
% 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;
% trigger frame capture
status = spi_write_register(port,MS_REG_FRAME_CAPTURE,hex2dec('83'));
% insert delay per data sheet
pause(3e-6)
% 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(MS_REG_PIXEL_BURST,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(50e-6)
% pixel burst read
for x = 1:MS_IMG_WIDTH
for y = 1:MS_IMG_HEIGHT
% 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
% mask pixel to 6 bit
pixel = bitand(value,63);
% store pixel in image array
imager(x,y) = pixel;
end
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 + -