dspic33 SPI

奋怒的紫苑 2019-09-03 02:06:03
SPI.c函数: static void Spi_vSpi2SetPin(void) { /*Chose SPI2: so SDI2 - RG7, SDO2 - RG8*/ TRISGbits.TRISG7 = 1; /*RG7 - input*/ TRISGbits.TRISG8 = 0; /*RG8 - output*/ /*use RD12 for CS signal*/ TRISDbits.TRISD12 = 0; /*RD12 - output*/ return; } static void Spi_vSpi2Write(unsigned char Data) { SPI2BUF = Data & 0xff; while(SPI2STATbits.SPITBF); Data = SPI2BUF; /*avoiding overflow when reading*/ return; } static unsigned char Spi_u8Spi2Read(void) { unsigned char Data=0; SPI2STATbits.SPIROV = 0; while(!SPI2STATbits.SPIRBF);/* Check for Receive buffer full status bit of status register*/ if (SPI2STATbits.SPIRBF) { SPI2STATbits.SPIROV = 0; Data = SPI2BUF; } return(Data); } void Spi_vSpi2Initial(void) { Spi_vSpi2SetPin(); /*intial SPI2STAT SFR*/ SPI2STATbits.SPIEN = 0; /*bits 15:disable SPI*/ SPI2STATbits.SPISIDL = 0; /*bit 13:still work in free mode*/ SPI2STATbits.SPIBEC = 0;/*bit 10-8:it will work in ESPI*/ SPI2STATbits.SRMPT = 0;/*bit 7:it will work in ESPI*/ SPI2STATbits.SPIROV = 0;/*bit 6:ont receive Ooerflow*/ SPI2STATbits.SRXMPT = 0;/*bits 5:it will work in ESPI*/ SPI2STATbits.SISEL = 0;/*bit 4-2:it will work in ESPI*/ SPI2STATbits.SPITBF = 0; /*bit 1:auto set or clear by hardware*/ SPI2STATbits.SPIRBF = 0;/*bit 0:auto set or clear by hardware*/ /*initial SPI2CON1 SFR*/ SPI2CON1bits.DISSCK = 0;/*bit 12: use internal SPI clock*/ SPI2CON1bits.DISSDO = 0;/*bit 11:SDO2 control by SPI*/ SPI2CON1bits.MODE16 = 0;/*bit 10:communication by 8 bits*/ SPI2CON1bits.SMP = 0;/*bit 9:input data during data output*/ SPI2CON1bits.CKE = 1;/*bit 8:change data when mode from work to free*/ SPI2CON1bits.SSEN = 0;/*bit 7:SSx control by SPI*/ SPI2CON1bits.CKP = 0;/*bit 6:work - high level;free - low level*/ SPI2CON1bits.MSTEN = 1;/*bit 5:enable Master mode*/ /*Fsck = Fcy/(SPRE * PPRE), Fsck = 30MHz/(3*4) = 2.5MHz*/ SPI2CON1bits.SPRE = 5;/*bit 4-2:Auxiliary preassigned frequency 3:1*/ SPI2CON1bits.PPRE = 2;/*bit 1-0:preassigned frequency 4:1*/ /*initial SPI2CON2 SFR*/ SPI2CON2bits.FRMEN = 0;/*bit 15:disable SPIx frame mode*/ SPI2CON2bits.SPIFSD = 0;/*bit 14:Frame synchronization pulse output*/ SPI2CON2bits.FRMPOL = 0;/*bit 13:Frame synchronization pulse low level*/ SPI2CON2bits.FRMDLY = 0;/*bit 1:use the same clock */ SPI2CON2bits.FRMEN = 0;/*bit 0:use standed mode*/ /*set input and output pins*/ RPOR14bits.RP120R = 8; RPOR13bits.RP118R = 9; /*SCK2 to G6*/ SPI2STATbits.SPIEN = 1; /*bits 15:enable SPI*/ } void Spi_vSpi2WriteEnable(void) { LATDbits.LATD12 = 0; Spi_vSpi2Write(SPI_WRITE_EN_COMMAND); LATDbits.LATD12 = 1; return; } void Spi_vSpi2WriteCheck(void) { unsigned char Status; do { LATDbits.LATD12 = 0; Spi_vSpi2Write(SPI_READ_SR_COMMAND); /*Read STATUS Register command*/ Status = Spi_u8Spi2Read(); /*Read STATUS Register*/ LATDbits.LATD12 = 1; } while (Status & 0x01); } void Spi_vSpi2WriteStatusReg(unsigned char StatusData) { LATDbits.LATD12 = 0; Spi_vSpi2Write(SPI_WRITE_SR_COMMAND); Spi_vSpi2Write(StatusData); LATDbits.LATD12 = 1; return; } void Spi_vSpi2WriteByte(unsigned char AddressH,unsigned char AddressL,unsigned char Data) { Spi_vSpi2WriteCheck(); LATDbits.LATD12 = 0; /*send BTTE WRITE SEQUENCE command*/ Spi_vSpi2Write(SPI_WRITE_COMMAND); /*write address:16 bits*/ Spi_vSpi2Write(AddressH);/*send AddressH*/ Spi_vSpi2Write(AddressL);/*send AddressL*/ /*write data*/ Spi_vSpi2Write(Data); LATDbits.LATD12 = 1; Spi_vSpi2WriteCheck(); return; } unsigned char Spi_u8Spi2ReadSequence(unsigned char AddressH,unsigned char AddressL) { static unsigned char Data; LATDbits.LATD12 = 0; /*send write READ SEQUENCE command*/ Spi_vSpi2Write(SPI_READ_COMMAND); /*write READ DATA address*/ Spi_vSpi2Write(AddressH);/*send AddressH*/ Spi_vSpi2Write(AddressL);/*send AddressL*/ /*read data*/ Data = Spi_u8Spi2Read(); LATDbits.LATD12 = 1; return(Data); } Main.c函数: void InitPorts(void) { TRISA = 0x0000; LATA = 0x00FF; /*LED is all ON*/ } void delay(void) { unsigned int i,j; for(i=0;i<3000;i++) { for(j=0;j<3000;j++) ; } } int main(void) { PLLFBD = 0x003A; CLKDIV = 0x0040; InitPorts(); delay(); delay(); Spi_vSpi2Initial(); while(1) { Spi_vSpi2WriteEnable(); Spi_vSpi2WriteByte(0x01,0x03,0x01); LATA = Spi_u8Spi2ReadSequence(0x01,0x03); delay(); delay(); } }
...全文
166 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧