📄 captlib.c
字号:
/*************************************************************/
/* test_spiread.c: MBF200 SPI driver for Arm9 */
/*************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "spi.h"
#include "captlib.h"
//#define TIMEOUT 100
#define TH 0xe0
#define TIMEDELAY 800
///interal functions
int _sensorinit(void);
int _readimage(TCaptImage tempdata);
unsigned char read_register(unsigned char add);
//////////////////////
int opensensor()
{
return(SPI_Init());
}
//////////////////////
void closesensor()
{
SPI_Close();
}
//////////////////////
int readimagedata(TCaptImage tempdata,int TIMEOUT)
{
int j;
if(_sensorinit()<0)
return(-1);
for(j=0;j<TIMEOUT;j++){
_readimage(tempdata);
if(checkimage(tempdata)>=0)
break;
}
if(j == TIMEOUT)
return(-2);
return(0);
}
/////////////////////////////
int checkimage(TCaptImage tempdata)
{
int i;
int sum,p;
sum = 0;
for(i=0;i<256;i++)
{
sum += tempdata[75][i];
}
p = sum/256;
if(p<TH)
{
sum = 0;
for(i=0;i<256;i++)
{
sum += tempdata[150][i];
}
p = sum/256;
if(p<TH)
{
sum = 0;
for(i=0;i<256;i++)
{
sum += tempdata[225][i];
}
p = sum/256;
if(p<TH)
{
return(0);
}
}
}
return(-1);
}
/////////////////////////////
int testsensor()
{
unsigned char tempdata;
if(_sensorinit()<0)
return(-1);
//Read registers
tempdata = read_register(0x48);//Read CTRLB
if(tempdata!=0x65)
return(-1);
tempdata = read_register(0x30);//Read DTR
if(tempdata!=0x30)
return(-1);
tempdata = read_register(0x38);//Read DCR
if(tempdata!=0x02)
return(-1);
tempdata = read_register(0x60);//Read PGC
if(tempdata!=0x0b)
return(-1);
return(0);
}
//////////////////////////////
unsigned char read_register(unsigned char add)
{
unsigned char curr;
SPI_CSLow(); //cs enable
SPI_Write(0x03);
SPI_Write(add);
SPI_Read(&curr);
SPI_CSHigh(); //cs disable
return curr;
}
////////////////////////////
int _sensorinit(void)
{
//Sensor initialization
int i;
//Write CTRLB with bits 2 and 0 set
SPI_CSLow(); //cs enable
if(SPI_Write(0x02)<0)
return(-1);
SPI_Write(0x48);
SPI_Write(0x05);
SPI_CSHigh(); //cs disable
//Write DTR
SPI_CSLow(); //cs enable
SPI_Write(0x02);
SPI_Write(0x30);
SPI_Write(0x30);
SPI_CSHigh(); //cs disable
//Write DCR
SPI_CSLow(); //cs enable
SPI_Write(0x02);
SPI_Write(0x38);
SPI_Write(0x02);
SPI_CSHigh(); //cs disable
//Write PGC
SPI_CSLow(); //cs enable
SPI_Write(0x02);
SPI_Write(0x60);
SPI_Write(0x0b);
SPI_CSHigh(); //cs disable
for(i = 0; i < 2000; i++) ;
return 0;
}
int _readimage(TCaptImage tempdata)
{
int i,j,k;
/* Write CTRLA */
SPI_CSLow(); //cs enable
if(SPI_Write(0x02)<0)
return(-1);
SPI_Write(0x40);
SPI_Write(0x02);
SPI_CSHigh(); //cs disable
for(i=0;i<300;i++){
for(k=0;k<TIMEDELAY;k++);
SPI_CSLow(); //cs enable
SPI_Write(0x03);
SPI_Write(0x40);
for(j=0;j<255;j++)
{
SPI_Read(&tempdata[i][j]);
}
tempdata[i][255] = 0xff;
//adjust for the speed of chip
SPI_CSHigh(); //cs disable
}
return 0;
}
int writeimagetofile(char *filename,TCaptImage tempdata)
{
int i,j;
unsigned short bfType;
struct BMPH{
/* unsigned short bfType;*/
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
}bitMFH;
struct BMPI{
unsigned long biSize;
unsigned long biWidth;
unsigned long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
unsigned long biXPelsPerMeter;
unsigned long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
}bitMIH;
struct PALETTE{
unsigned char rgbRed;
unsigned char rgbGreen;
unsigned char rgbBlue;
unsigned char rgbReserved;
}RgbQuad;
FILE *fp;
if((fp=fopen(filename,"wb"))==NULL)
{
printf("Cannot open file!\n");
exit(0);
}
bfType = 0x4d42;
fwrite(&bfType,2,1,fp);
bitMFH.bfSize = 0x13036;
bitMFH.bfReserved1 = 0;
bitMFH.bfReserved2 = 0;
bitMFH.bfOffBits = 1078;
fwrite(&bitMFH,12,1,fp);
bitMIH.biSize = 40;
bitMIH.biWidth = 256;
bitMIH.biHeight = 300;
bitMIH.biPlanes = 1;
bitMIH.biBitCount = 8;
bitMIH.biCompression = 0;
bitMIH.biSizeImage = 0x12c00;
bitMIH.biXPelsPerMeter = 0;
bitMIH.biYPelsPerMeter = 0;
bitMIH.biClrUsed = 0;
bitMIH.biClrImportant = 0;
fwrite(&bitMIH,40,1,fp);
for(i = 0;i<256;i++)
{
RgbQuad.rgbRed = i;
RgbQuad.rgbGreen = i;
RgbQuad.rgbBlue = i;
RgbQuad.rgbReserved = i;
fwrite(&RgbQuad,4,1,fp);
}
for(i=299;i>=0;i--)
{
for(j=0;j<256;j++)
{
fwrite(&tempdata[i][j],1,1,fp);
}
}
fclose(fp);
printf("OK!\n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -