软件模拟写SPI时序

2019-04-14 16:21发布

ISA板使用一个端口寄存器连接了LTC1448,使用软件模拟SPI时序写入数据   #include void SoftwareSimSPIWrite(const ULONGLONG uLLdata, //数据 const char bitsWidth, //数据宽度 bool bLeftAlign, //左对齐? bool bMSBFirst //高位先发? ) { #define CSActive 0 //CS有效电平 #define ClkActive 1 //Clk有效电平 #define DataActive 1 //Data有效电平 #define wPortAddress 660 //端口地址 #define WriteDACPortBit(cs, clk, din) /*写端口宏*/ do { BYTE byteData = 0;/*构造数据*/ byteData |= (BYTE)(((cs)? CSActive: (!CSActive)) << 0); /*CS 在bit0*/ byteData |= (BYTE)(((clk)? ClkActive: (!ClkActive)) << 1); /*clk 在bit1*/ byteData |= (BYTE)(((din)? DataActive: (!DataActive)) << 2); /*din 在bit2*/ _outp(wPortAddress, byteData);/*写入端口*/ }while(0); //位移掩码初始处理 ULONGLONG ullMask = 0; if(bMSBFirst) { if(bLeftAlign) ullMask = 0x8000000000000000ui64; else ullMask = 1ui64 << (bitsWidth-1); } else { if(bLeftAlign) ullMask = 1ui64 << (64 - bitsWidth); else ullMask = 1ui64; } WriteDACPortBit(0, 0, 0); //置CS CLK DATA无效 WriteDACPortBit(1, 0, 0); //置CS有效 CLK DATA无效 for(int i=0; i>= 1) : (ullMask <<= 1); //位移掩码 } WriteDACPortBit(1, 0, 0); //置CS有效 CLK DATA无效 WriteDACPortBit(0, 0, 0); //置CS CLK DATA无效 } void WriteLTC1448(const WORD dataA, const WORD dataB) { DWORD dwData = ((dataA & 0xFFFUL) << 12) | (dataB & 0xFFFUL); SoftwareSimSPIWrite(dwData, 24, false, true); }