int ADC_IOinit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PIN_CLK; GPIO_Init(PIN_GROUP, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = PIN_CONV; GPIO_Init(PIN_GROUP, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PIN_DAT; GPIO_Init(PIN_GROUP, &GPIO_InitStructure); CONV_H(); CLK_L(); return 0; }
uint16_t ADC_Converter(void) { uint32_t i; //用于12位数字的计数 uint16_t result = 0; //时序图参见文档的12页。 CONV_H(); Delay_nop(SHORT_DELAY); CONV_L(); // CONV下降沿表示转换启动。 Delay_nop(SHORT_DELAY); CLK_H(); // 先连续两个时钟脉冲,满足时序要求 Delay_nop(SHORT_DELAY); CLK_L(); Delay_nop(SHORT_DELAY); CLK_H(); Delay_nop(SHORT_DELAY); CLK_L(); for(i=0;i<12;i++) // 第三个脉冲开始读取12位的转换内容。 { CLK_H(); Delay_nop(SHORT_DELAY); if( DAT_READ() ) result |= 0x0001; else result &= 0xfffe; CLK_L(); Delay_nop(SHORT_DELAY); result <<= 1; } CLK_H(); Delay_nop(SHORT_DELAY); CLK_L(); // 最后发两个脉冲满足16位的时钟对齐。 Delay_nop(SHORT_DELAY); CLK_H(); Delay_nop(SHORT_DELAY); CLK_L(); Delay_nop(SHORT_DELAY); CONV_H(); // 表示转换结束。 return(result); //返回值 }
u8 SPI_write_byte(u8 byte) { u8 i; for(i=0;i<8;i++) { if(byte & 0x80) MOSI_H(); else MOSI_L(); byte = (byte << 1); CLK_H(); byte |= READ_MISO; CLK_L(); } return(byte); }
static void write_TM1616(u8 data) { u8 data_temp = data; u8 i; for(i=0;i<8;i++) { if((data_temp&0x01)!=0) //send from lower bit { DIN_H(); } else { DIN_L(); } CLK_L(); //TM1616 read data as clk positive edge ndelay(1); CLK_H(); ndelay(1); data_temp = data_temp>>1; } }