static void spi_transfer(uint16_t *in_buf, const uint16_t *out_buf, int length) { for (int i = 0;i < length;i++) { uint16_t send = out_buf ? out_buf[i] : 0xFFFF; uint16_t recieve = 0; for (int bit = 0;bit < 16;bit++) { palWritePad(DRV8301_MOSI_GPIO, DRV8301_MOSI_PIN, send >> 15); send <<= 1; palSetPad(DRV8301_SCK_GPIO, DRV8301_SCK_PIN); spi_delay(); palClearPad(DRV8301_SCK_GPIO, DRV8301_SCK_PIN); int r1, r2, r3; r1 = palReadPad(DRV8301_MISO_GPIO, DRV8301_MISO_PIN); __NOP(); r2 = palReadPad(DRV8301_MISO_GPIO, DRV8301_MISO_PIN); __NOP(); r3 = palReadPad(DRV8301_MISO_GPIO, DRV8301_MISO_PIN); recieve <<= 1; if (utils_middle_of_3_int(r1, r2, r3)) { recieve |= 1; } spi_delay(); } if (in_buf) { in_buf[i] = recieve; } } }
/******************************************************************************* * 函数名称: emif_epld_adc_spi_write * 功 能: 并口寄存器epld adc spi通道写数据。先写高位 下降沿写数 * 参 数: * 参数名称 类型 描述 * data unsigned int 所要写入的数据 * length unsigned char 数据位宽 * 返回值: * 无 * 说 明: * 日 期 版本 作者 修改人 DEBUG * ----------------------------------------------------------------- * 2012/06/15 V1.0 H4 无 : *******************************************************************************/ int emif_epld_adc_spi_write(unsigned int data,unsigned char length) { unsigned char i; if(length>32){ return -1; } emif_epld_adc_spi_le(SPI_H); spi_delay(SPI_TIME_DELAY); emif_epld_adc_spi_clk(SPI_H); emif_epld_adc_spi_le(SPI_L); for(i=0;i<length;i++){ if((data&(1<<(length-1-i)))!=0) emif_epld_adc_spi_out(SPI_H); else emif_epld_adc_spi_out(SPI_L); emif_epld_adc_spi_clk(SPI_H); spi_delay(SPI_TIME_DELAY); emif_epld_adc_spi_clk(SPI_L); spi_delay(SPI_TIME_DELAY); emif_epld_adc_spi_clk(SPI_H); } emif_epld_adc_spi_le(SPI_H); spi_delay(SPI_TIME_DELAY); return 0; }
int dru_lmx2531_fdd_lte2_init() { unsigned int R6,R7,R8,R9,R12; R6 = 0x0288006; R7 = 0x0000307; R8 = 0x0028008; R9 = 0x0000ba9; R12= 0x001048c; emif_epld_spi_channel(4); //usleep(1000); spi_delay(10000); emif_epld_spi_write(0x840005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x800005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x5807F5,LMX2531_REG_LENGTH ); //usleep(1000); spi_delay(10000); emif_epld_spi_write(R12,LMX2531_REG_LENGTH ); emif_epld_spi_write(R9,LMX2531_REG_LENGTH ); emif_epld_spi_write(R8,LMX2531_REG_LENGTH ); emif_epld_spi_write(R7,LMX2531_REG_LENGTH ); emif_epld_spi_write(R6,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x000004,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x6cc003,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x4c0022,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x3e0001,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x361da0,LMX2531_REG_LENGTH ); //emif_epld_spi_write(0x2C0001,LMX2531_REG_LENGTH );// return 1; }
UBYTE sd_cmd8() { BYTE r; sd_wait_ready(); spi_send_byte(0x48); spi_send_byte(0x00); spi_send_byte(0x00); spi_send_byte(0x01); spi_send_byte(0xaa); spi_send_byte(0x87); r = sd_wait_r1(); spi_delay(); spi_delay(); spi_delay(); spi_delay(); spi_delay(); #ifdef DEBUG_SD debug_puts("cmd8:"); debug_print_byte(r); debug_puts("\n"); #endif return r; }
int dru_lmx2531_wcdma_init() { // for LMX2531_2050E, XTLSEL = manu; XDIV = 8; osc =61.44; unsigned int R6,R7,R8,R9,R12; R6 = 0x0288056; R7 = 0x0000307; R8 = 0x0028008; R9 = 0x0000ba9; R12= 0x001048c; emif_epld_spi_channel(2); //usleep(1000); spi_delay(10000); emif_epld_spi_write(0x840005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x800005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x5807F5,LMX2531_REG_LENGTH );//5807f5 8007f5 //usleep(1000); spi_delay(10000); emif_epld_spi_write(R12,LMX2531_REG_LENGTH ); emif_epld_spi_write(R9,LMX2531_REG_LENGTH ); emif_epld_spi_write(R8,LMX2531_REG_LENGTH ); emif_epld_spi_write(R7,LMX2531_REG_LENGTH ); emif_epld_spi_write(R6,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x0000004,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x06cc003,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x0580022,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x03e0001,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x03c25f0,LMX2531_REG_LENGTH ); //emif_epld_spi_write(0x2C0001,LMX2531_REG_LENGTH );// return 1; }
UBYTE sd_cmd58() { BYTE r; sd_wait_ready(); spi_send_byte(0x7a); spi_send_byte(0x00); spi_send_byte(0x00); spi_send_byte(0x00); spi_send_byte(0x00); spi_send_byte(0xff); r = sd_wait_r1(); spi_delay(); // if &0xc0==0xc0 => SDHC spi_delay(); spi_delay(); spi_delay(); #ifdef DEBUG_SD debug_puts("cmd58:"); debug_print_byte(r); debug_puts("\n"); #endif return r; }
int dru_lmx2531_gsm1_init() { unsigned int R6,R7,R8; R6 = 0x0080006; R7 = 0x0000107; R8 = 0x0028008; emif_epld_spi_channel(4); //usleep(1000); spi_delay(10000); emif_epld_spi_write(0x840005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x800005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x8007F5,LMX2531_REG_LENGTH ); //usleep(1000); spi_delay(1000); emif_epld_spi_write(R8,LMX2531_REG_LENGTH ); emif_epld_spi_write(R7,LMX2531_REG_LENGTH ); emif_epld_spi_write(R6,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x000004,LMX2531_REG_LENGTH ); emif_epld_spi_write(0xecc003,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x430042,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x03e0001,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x0690240,LMX2531_REG_LENGTH ); //emif_epld_spi_write(0x2C0001,LMX2531_REG_LENGTH );// return 1; }
/******************************************************************************* *函数名称 : int dru_lmx2531_gsm_main_dcs_init() *功 能 : 主单元 *输入参数 : *输出参数 : *******************************************************************************/ int dru_lmx2531_gsm_main_dcs_init()//1663.9 { unsigned int R6,R7,R8,R9,R12; R6 = 0x0288006; R7 = 0x0000307; R8 = 0x0028008; R9 = 0x0000ba9; R12= 0x001048c; emif_epld_spi_channel(1); //usleep(1000); spi_delay(10000); emif_epld_spi_write(0x840005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x800005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x5807F5,LMX2531_REG_LENGTH ); //usleep(1000); spi_delay(10000); emif_epld_spi_write(R12,LMX2531_REG_LENGTH ); emif_epld_spi_write(R9,LMX2531_REG_LENGTH ); emif_epld_spi_write(R8,LMX2531_REG_LENGTH ); emif_epld_spi_write(R7,LMX2531_REG_LENGTH ); emif_epld_spi_write(R6,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x000004,LMX2531_REG_LENGTH ); emif_epld_spi_write(0xecc043,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x7b0042,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x3e0041,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x5d96b0,LMX2531_REG_LENGTH );// 721.4M 电信cdma return 1; }
static void SetData( unsigned short Data) { LCD_CS( 0); spi_delay( 1); SendStartByte( 0, 1); SendByte( Data); spi_delay( 1); LCD_CS( 1); }
static void SetIndex( unsigned char Index) { LCD_CS( 0); spi_delay( 1 ); SendStartByte( 0, 0); SendByte( Index); spi_delay( 1 ); LCD_CS( 1); }
int sd_load_sector(UBYTE* target, DWORD sector) { DWORD address; BYTE r; BYTE timeout; address = sector<<9; #ifdef DEBUG_SD debug_puts("loading address "); debug_print_dword(address); debug_puts("\n"); #endif sd_wait_ready(); // read block spi_assert_cs(); spi_send_byte(0x51); // CMD17 spi_send_byte((address>>24)&0xff); spi_send_byte((address>>16)&0xff); spi_send_byte((address>>8)&0xff); spi_send_byte(address&0xff); spi_send_byte(0xff); r = sd_wait_r1(); #ifdef DEBUG_SD debug_puts("cmd17:"); debug_print_byte(r); debug_puts("\n"); #endif if ((r&0x80)!=0) { spi_deassert_cs(); return FALSE; } // wait for 0xfe (start of block) timeout = 0xff; while (spi_receive_byte()!=0xfe) { if (timeout==0) { spi_deassert_cs(); return FALSE; } timeout = timeout-1; } // read block load_data(target); // skip crc spi_delay(); spi_delay(); // shutdown spi_delay(); spi_deassert_cs(); return TRUE; }
//------------------------------------------------------------------- void clear_screen ( void ) { SPI_CS_ON; spi_delay(); spi_write_byte(0x20); spi_write_byte(0x00); spi_delay(); SPI_CS_OFF; }
static void LcdSend(unsigned char Value) { LCD_CS(0); spi_delay(5); WriteByte( Value); spi_delay( 5); LCD_CS( 1); spi_delay(5); }
static void spi_write(unsigned char b) { for(int i = 7; i >= 0; i--) { SPI_SCL(false); spi_delay(); SPI_SDO((b >> i) & 1); spi_delay(); SPI_SCL(true); spi_delay(); } }
//------------------------------------------------------------------- void spi_write_byte ( unsigned char d ) { unsigned char ca; for(ca=0x80;ca;ca>>=1) { if(ca&d) SPI_MOSI_ON; else SPI_MOSI_OFF; spi_delay(); SPI_CLK_ON; spi_delay(); SPI_CLK_OFF; spi_delay(); } }
//------------------------------------------------------------------- void spi_write_sharp_address ( unsigned char d ) { unsigned char ca; for(ca=0x01;;ca<<=1) { if(ca&d) SPI_MOSI_ON; else SPI_MOSI_OFF; spi_delay(); SPI_CLK_ON; spi_delay(); SPI_CLK_OFF; spi_delay(); if(ca==0x80) break; } }
/* * Polls for non-busy status */ static int spi_tx_check_busy(u8 mask) { struct spi_dev *dev = &spi_dev; u8 limit = 16; u8 status; /* * Poll for valid, non-busy status. */ do { status = spi_platform_io(0); if (!(status & mask)) { break; } spi_delay(); } while (limit-- > 0); if (status & ASPI_MSTAT_INVAL) { STATS(tx_stat_inval); return 1; } if (status & mask) { if (status & ASPI_MSTAT_ATTN) { dev->state = SS_RX_WAIT; return 2; } STATS(tx_still_busy); return 3; } return 0; }
static void LCD_ILI9481_CMD(unsigned char cmd) { LCD_CS(0); LCD_SCL(0); spi_delay(1); LCD_SI(0); LCD_SCL(1); spi_delay(1); SendByte(cmd); spi_delay(1); LCD_CS( 1); }
static int spi_test(void) { uint8_t res = 0; uint8_t data = 0x23; printf("SPI test\n"); while(1) { spi_delay(1000000); res = 0; // sync spi_sync(); printf(">> synchronized\n"); // data from master if (HAL_SPI_Receive(&SpiHandle, &res, 1, SPI_TIMEOUT_MAX) != HAL_OK) { printf("HAL_SPI_Receive error 1\n"); return -1; } if (res != 0x57) { printf("HAL_SPI_Receive recieved not 0x57 but %x\n", res); } // request data if (HAL_SPI_Transmit(&SpiHandle, &data, 1, SPI_TIMEOUT_MAX) != HAL_OK) { printf("HAL SPI Transmit error\n"); return -1; } } return 0; }
/* *************************************************************** * 名称: Rec_1_Char * 功能: 模拟spi接收字节 * 输入: NULL * 输出: NULL * 返回: 返回接收到的数据 * 描述: 无 *************************************************************** */ unsigned char Rec_1_Char(void) { unsigned char i, Temp = 0; for (i = 0; i < 8; i++) { Temp <<= 1; Temp |= MYSPI_MISO; MYSPI_SCK_1; spi_delay(6); MYSPI_SCK_0; spi_delay(6); } return Temp; }
static void LCD_ILI9481_INDEX(unsigned char index) { LCD_CS(0); LCD_SCL(0); spi_delay(1); LCD_SI(1); LCD_SCL(1); spi_delay(1); SendByte(index); spi_delay(1); LCD_CS( 1); }
/* *************************************************************** * 名称: Send_1_Char * 功能: 模拟spi发送字节 * 输入: NULL * 输出: NULL * 返回: NULL * 描述: 无 *************************************************************** */ void Send_1_Char(unsigned char Data) { unsigned char i; for (i = 0; i < 8; i++) { if (Data & 0x80) MYSPI_MOSI_1; else MYSPI_MOSI_0; spi_delay(6); MYSPI_SCK_1; Data <<= 1; spi_delay(6); MYSPI_SCK_0; } }
UBYTE spi_receive_byte() { spi_delay(); #asm in a,($01) ld l,a ld h,0 #endasm }
int dru_lmx2531_wcdma_config(unsigned int freq) { // for LMX2531_2050E, XTLSEL = manu; XDIV = 8; osc =61.44; unsigned int R6,R7,R8,R9,R12,R0=0; unsigned short NUM=0; unsigned char N=0; R6 = 0x0288056; R7 = 0x0000307; R8 = 0x0028008; R9 = 0x0000ba9; R12= 0x001048c; emif_epld_spi_channel(2); //usleep(1000); spi_delay(10000); N= freq/30720; NUM=(freq-N*30720)/20; R0= (N <<16) |(NUM<<4); emif_epld_spi_write(0x840005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x800005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x5807F5,LMX2531_REG_LENGTH );//5807f5 8007f5 //usleep(1000); spi_delay(10000); emif_epld_spi_write(R12,LMX2531_REG_LENGTH ); emif_epld_spi_write(R9,LMX2531_REG_LENGTH ); emif_epld_spi_write(R8,LMX2531_REG_LENGTH ); emif_epld_spi_write(R7,LMX2531_REG_LENGTH ); emif_epld_spi_write(R6,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x0000004,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x06cc003,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x0580022,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x03e0001,LMX2531_REG_LENGTH ); emif_epld_spi_write(R0,LMX2531_REG_LENGTH ); //emif_epld_spi_write(0x03c25f0,LMX2531_REG_LENGTH ); //emif_epld_spi_write(0x2C0001,LMX2531_REG_LENGTH );// return 1; }
static void tegra_spi_wait(struct tegra_spi_channel *spi) { unsigned int count, dma_blk; dma_blk = 1 + (read32(&spi->regs->dma_blk) & (SPI_DMA_CTL_BLOCK_SIZE_MASK << SPI_DMA_CTL_BLOCK_SIZE_SHIFT)); while ((count = spi_byte_count(spi)) != dma_blk) spi_delay(spi, dma_blk - count); }
int dru_lmx2531_fdd_lte2_config(unsigned int freq) { unsigned int R6,R7,R8,R9,R12,R0=0; unsigned short NUM=0; unsigned char N=0; R6 = 0x0288006; R7 = 0x0000307; R8 = 0x0028008; R9 = 0x0000ba9; R12= 0x001048c; emif_epld_spi_channel(4); //usleep(1000); spi_delay(10000); N= freq/30720; NUM=(freq-N*30720)/40; R0= (N <<16) |(NUM<<4); emif_epld_spi_write(0x840005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x800005,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x5807F5,LMX2531_REG_LENGTH ); //usleep(1000); spi_delay(10000); emif_epld_spi_write(R12,LMX2531_REG_LENGTH ); emif_epld_spi_write(R9,LMX2531_REG_LENGTH ); emif_epld_spi_write(R8,LMX2531_REG_LENGTH ); emif_epld_spi_write(R7,LMX2531_REG_LENGTH ); emif_epld_spi_write(R6,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x000004,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x6cc003,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x4c0022,LMX2531_REG_LENGTH ); emif_epld_spi_write(0x3e0001,LMX2531_REG_LENGTH ); emif_epld_spi_write(R0,LMX2531_REG_LENGTH ); //emif_epld_spi_write(0x361da0,LMX2531_REG_LENGTH ); //emif_epld_spi_write(0x2C0001,LMX2531_REG_LENGTH );// return 1; }
void dru_lm2581_init(void) { lm2581_spi_channel(1); lm2581_spi_write(0x00108015); spi_delay(10000); lm2581_spi_write(0x021FE80F); lm2581_spi_write(0x4082C10D); lm2581_spi_write(0x210050CA); lm2581_spi_write(0x03C7C039); lm2581_spi_write(0x207DDBF8); lm2581_spi_write(0x00082317); lm2581_spi_write(0x000004C6); lm2581_spi_write(0x0010A805); lm2581_spi_write(0x00000004); lm2581_spi_write(0x2005E3c3); lm2581_spi_write(0x0FD09002); lm2581_spi_write(0xC53A2051); lm2581_spi_write(0x41062750); spi_delay(50000); lm2581_spi_write(0x41062750); lm2581_spi_channel(2); lm2581_spi_write(0x00108015); spi_delay(10000); lm2581_spi_write(0x021FE80F); lm2581_spi_write(0x4082C10D); lm2581_spi_write(0x210050CA); lm2581_spi_write(0x03C7C039); lm2581_spi_write(0x207DDBF8); lm2581_spi_write(0x00082317); lm2581_spi_write(0x000004C6); lm2581_spi_write(0x00108005); lm2581_spi_write(0x00000004); lm2581_spi_write(0x2001E3C3); lm2581_spi_write(0x2C001902); lm2581_spi_write(0xC4002021); lm2581_spi_write(0x401F0860); spi_delay(50000); lm2581_spi_write(0x401F0860); }
static int read_command(unsigned char reg,unsigned char *value) { int i=16; int temp=0; int pin_value; unsigned char adr = reg; gpio_write_io(cs_pin,1);//CS=1 gpio_write_io(data_pin,0);//SCL=0 gpio_write_io(clk_pin,0);//SDA adr = adr << 1; // set csn low gpio_write_io(cs_pin,0);//CS=0 spi_delay(delay_time); for(i=0;i<16;i++) { if(i<8) { if(i==1) gpio_write_io(data_pin,1); // read flag else { if(adr&0x80) gpio_write_io(data_pin,1); else gpio_write_io(data_pin,0); adr = adr << 1; } spi_delay(delay_time); gpio_write_io(clk_pin,1); spi_delay(delay_time); gpio_write_io(clk_pin,0); spi_delay(delay_time); } else { gpio_write_io(clk_pin,1); spi_delay(delay_time); pin_value=gpio_read_io(data_pin); temp = temp<<1; temp+=pin_value; spi_delay(delay_time); gpio_write_io(clk_pin,0); spi_delay(delay_time); } } gpio_write_io(cs_pin,1); *value = temp; printk("reg 0x%x,value 0x%x\r\n",reg,temp); return 0; }
static int sent_command(unsigned char adr,unsigned char value) { int i=16; gpio_write_io(cs_pin,1);//CS=1 gpio_write_io(data_pin,0);//SCL=0 gpio_write_io(clk_pin,0);//SDA adr = adr << 1; // set csn low gpio_write_io(cs_pin,0);//CS=0 spi_delay(delay_time); for(i=0;i<16;i++) { if(i<8) { if(i==1) gpio_write_io(data_pin,0); // write flag else { if(adr&0x80) gpio_write_io(data_pin,1); else gpio_write_io(data_pin,0); adr = adr << 1; } spi_delay(delay_time); gpio_write_io(clk_pin,1); spi_delay(delay_time); gpio_write_io(clk_pin,0); spi_delay(delay_time); } else { if(value&0x80) gpio_write_io(data_pin,1); else gpio_write_io(data_pin,0); value = value <<1; spi_delay(delay_time); gpio_write_io(clk_pin,1); spi_delay(delay_time); gpio_write_io(clk_pin,0); spi_delay(delay_time); } } gpio_write_io(cs_pin,1); return 0; }
/******************************************************************************* * 函数名称: lm2581_spi_write * 功 能: 并口寄存器epld spi通道写数据。先写高位 上升沿写数 * 参 数: * 参数名称 类型 描述 * data unsigned int 所要写入的数据 * length unsigned char 数据位宽 * 返回值: * 无 * 说 明: * 日 期 版本 作者 修改人 DEBUG * ----------------------------------------------------------------- * 2012/06/15 V1.0 H4 无 : *******************************************************************************/ int lm2581_spi_write(unsigned int data) { unsigned char i; lm2581_spi_le(1); spi_delay(1); lm2581_spi_clk(0); lm2581_spi_le(0); for(i=0;i<32;i++){ if((data&(1<<(32-1-i)))!=0) lm2581_spi_out(1); else lm2581_spi_out(0); lm2581_spi_clk(0); spi_delay(1); lm2581_spi_clk(1); spi_delay(1); lm2581_spi_clk(0); } lm2581_spi_le(1); spi_delay(1); return 0; }