/* * SPI_Driv.c * * Created on: 2021年4月2日 * Author: dell */ #include "SPI_Driv.h" extern XGpioPs psGpioInstancePtr; //端口 extern XGpioPs_Config* GpioConfigPtr; //设备ID extern u32 K7_U0[16]; extern u32 molex_4_bank_3[4]; extern u32 cs_en_bank_3[4]; /****************************************************************************** * Function : void interface_initial(u32* device,u32 num_wire) * Description : interface initial * Parameter : device -- CPLD * num_wire -- 复位线编号 * Return : void ******************************************************************************/ void interface_initial(u32* device) //wire_num = cs sck sdi/o { u32 sck = *(device+0); u32 cs = *(device+1); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, cs, 1); } /****************************************************************************** * Function : void rst_CPLD(u32* device,u32 num_wire) * Description : CPLD reset * Parameter : device -- CPLD * num_wire -- 复位线编号 * Return : void ******************************************************************************/ void rst_CPLD(u32* device,u32 num_wire) //wire_num = cs sck sdi/o { u32 rst_n = *(device+num_wire); XGpioPs_WritePin(&psGpioInstancePtr, rst_n, 1); XGpioPs_WritePin(&psGpioInstancePtr, rst_n, 0); XGpioPs_WritePin(&psGpioInstancePtr, rst_n, 0); usleep(2); XGpioPs_WritePin(&psGpioInstancePtr, rst_n, 1); } /****************************************************************************** * Function : void spi_write_onewire(char addr, u32 data, char width, u32* device) * Description : spi onewire write * Parameter : addr -- 地址 * data -- 数据 * width -- 数据长度 * device -- CPLD * Return : void ******************************************************************************/ void spi_write_onewire(u8 addr, u8 *data, u8 width, u32* device) { char temp_addr = 0; //u32 temp_data = 0; u32 temp_data = 0; char i = 0,j=0; u32 sck = *(device+0); u32 cs= *(device+1); u32 sdi= *(device+2); temp_addr = addr; ///temp_data = data; //XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, cs, 0); XGpioPs_WritePin(&psGpioInstancePtr, cs, 0); //XGpioPs_WritePin(&psGpioInstancePtr, sdi, 1); // w/r标志位 1=w 0=r //XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); //XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); for(i = 0; i < 8; i++) // 8bit地址 { XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); if(temp_addr&0x80) XGpioPs_WritePin(&psGpioInstancePtr, sdi, 1); //sck低电平传输数据 数据从中间变量到通信线上 else XGpioPs_WritePin(&psGpioInstancePtr, sdi, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); temp_addr = temp_addr<<1; //sck高电平准备数据,此处为准备第二个数据,第一个数据已经传输完毕 } for(j=0;j>16); read_data[1] = (u8)(temp_data>>8); read_data[0] = (u8)(temp_data); return temp_data; } /****************************************************************************** * Function : u32 uspi_read_onewire(char addr, char width, u32* device) * Description : spi onewire read * Parameter : addr -- 地址 * width -- 数据长度 * device -- CPLD * Return : u32 reg_data ******************************************************************************/ u32 uspi_read_onewire(char addr, char width, u32* device) { char temp_addr=0; u32 temp_data=0; char i=0,j=0; u32 sck = *(device+0); u32 cs= *(device+1); u32 sdi= *(device+2); u32 sdo= *(device+3); temp_addr = addr; //XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, cs, 0); XGpioPs_WritePin(&psGpioInstancePtr, cs, 0); //XGpioPs_WritePin(&psGpioInstancePtr, sdi, 0); // w/r标志位 1=w 0=r //XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); //XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); for(i = 0; i < 8; i++) // 8bit地址 { XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); if(temp_addr&0x80) XGpioPs_WritePin(&psGpioInstancePtr, sdi, 1); //sck低电平传输数据 数据从中间变量到通信线上 else XGpioPs_WritePin(&psGpioInstancePtr, sdi, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); temp_addr = temp_addr<<1; //sck高电平准备数据,此处为准备第二个数据,第一个数据已经传输完毕 } for(j=0; j>(4*(1-i)))&0x0F; //sck高电平准备数据 数据从MCU到中间变量上 XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); fourwire_write(split_addr[i],sdi0,sdi1,sdi2,sdi3); //sck低电平传输数据 数据从中间变量到通信线上 XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); } for(i = 0; i < 4;i++) //16bit数据 4根线分四次传输 { split_data[i] = (temp_data>>(4*(3-i)))&0x0F; XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); fourwire_write(split_data[i],sdi0,sdi1,sdi2,sdi3); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); } XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, cs, 1); fourwire_write(0x00,sdi0,sdi1,sdi2,sdi3); //usleep(20); } /****************************************************************************** * Function : u16 fourwire_read(u32 sdo0, u32 sdo1, u32 sdo2, u32 sdo3) * Description : forwire read from reg * Parameter : sdo0,sdo1,sdo2,sdo3--IO * Return : rxdata--数据 ******************************************************************************/ u16 fourwire_read(u32 sdo0, u32 sdo1, u32 sdo2, u32 sdo3) { u32 GPIO_PIN[4]; u16 rdata[4]; u16 rxdata = 0; GPIO_PIN[0] = sdo0; GPIO_PIN[1] = sdo1; GPIO_PIN[2] = sdo2; GPIO_PIN[3] = sdo3; for(u8 i = 0; i < 4 ; i++) { rdata[i] = XGpioPs_ReadPin(&psGpioInstancePtr,GPIO_PIN[i]); //xil_printf("rdata[i] = %x\r\n",rdata[i]); rxdata = ((rdata[i])<> 4)&0x0F; split_addr[1] = (temp_addr)&0x0F; XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, cs, 0); XGpioPs_WritePin(&psGpioInstancePtr, cs, 0); fourwire_write(0x00,sdio0,sdio1,sdio2,sdio3); // w/r标志位 1=w 0=r XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); for(i = 0; i < 2; i++) // 8bit地址 四根线分两次传输 { XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); fourwire_write(split_addr[i],sdio0,sdio1,sdio2,sdio3); //sck低电平传输数据 数据从中间变量到通信线上 XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); } for(i = 0; i < 4; i++) { XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, *(device+2+i),0); //input } for(i = 0; i < 4; i++) //16bit数据 4根线分四次接收 { XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); split_data[i] = fourwire_read(sdio0,sdio1,sdio2,sdio3); //sck低电平准备数据 数据从通信线到中间变量上 XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); XGpioPs_WritePin(&psGpioInstancePtr, sck, 1); temp_data = temp_data<<4; temp_data = temp_data + split_data[i]; //temp_data = (split_data[i]<<(4*(3-i))) + temp_data; //sck高电平接收数据 数据从中间变量到MCU上 // xil_printf("split_data[i],temp_data = %x,%x\r\n",split_data[i],temp_data); } for(i = 0; i < 4; i++) { XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, *(device+2+i),1); //output } XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); XGpioPs_WritePin(&psGpioInstancePtr, sck, 0); fourwire_write(0x00,sdio0,sdio1,sdio2,sdio3); *rxdata = temp_data; XGpioPs_WritePin(&psGpioInstancePtr, cs, 1); XGpioPs_WritePin(&psGpioInstancePtr, cs, 1); XGpioPs_WritePin(&psGpioInstancePtr, cs, 1);//add 2 lines //usleep(20); } /****************************************************************************** * Function : void GPIO_dir_set(u32* device,char dir) * Description : change GPIO direction * Parameter : device -- CPLD * dir -- GPIO_OUT/GPIO_IN * Return : void ******************************************************************************/ void GPIO_dir_set_16(u32* device,char dir) { u32 sdio[16] = {0}; u8 i; for(i = 0; i < 16;i++) { sdio[i] = *(device+i); //XGpioPs_SetDirectionPin(&psGpioInstancePtr, sdio[i],1); XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, sdio[i],dir); } } void GPIO_dir_set_cs_enable(u32* device,u8 dir) { u32 sdio[4] = {0}; u8 i; u8 dir_temp = 0; for(i = 0; i < 4;i++) { sdio[i] = *(device+i); dir_temp = (((dir >> (3-i))) & 0x01); XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, sdio[i],dir_temp); } } void rst(char *d) { XGpioPs_WritePin(&psGpioInstancePtr, *d, 0); XGpioPs_WritePin(&psGpioInstancePtr, *d, 1); usleep(20); XGpioPs_WritePin(&psGpioInstancePtr, *d, 0); } void func_test(void) { XGpioPs_Write(&psGpioInstancePtr, 0x03, 0x12345678); }