求PIC芯片普通IO端口模拟SPI程序

2020-02-08 09:14发布

各位大神,请问如何用普通IO端口模拟SPI模块?求程序,万分感谢。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
yijianhanmei90
2020-02-09 05:06
sn516952 发表于 2012-5-14 09:06
按时序写.时序对了.就没问题了

我用PIC24FJ128GA310接flash,四个管脚:SCK、CE、SI、SO.程序如下,可是用串口助手接受数据只是0034,不正确,求指导
#include <p24FJ128GA310.h>
void spi_writeen()                 //写使能
{
        int i;
        int j;
    j=0x6;

        PORTAbits.RA4=1;    //        CE=1;

        PORTFbits.RF4=0;    //        SCK=0;
        Nop();

        PORTAbits.RA4=0;     //        CE=0;
        Nop();
        Nop();

        for(i=0;i<8;i++)                  
        {       
                Nop();
                Nop();
                if(j&0x80)

                PORTFbits.RF7=1;       //                SI=1;

                else PORTFbits.RF7=0;    //                else SI=0;
                j=j<<1;

                PORTFbits.RF4=1;     //                SCK=1;
                Nop();
                Nop();

                PORTFbits.RF4=0;     //                SCK=0;
        }       

        PORTAbits.RA4=1;   //        CE=1;
        Nop();
        Nop();
        Nop();
        Nop();
}



void spi_write()                 //页编程
{
        int i,j,k,l;
        j=0x2;
        k=0x10;
        l=0x01;

        PORTAbits.RA4=1;    //        CE=1;

        PORTFbits.RF4=0;    //        SCK=0;
        Nop();
        Nop();

        PORTAbits.RA4=0;    //        CE=0;
        Nop();
        Nop();
        for(i=0;i<8;i++)               
        {
                Nop();
                Nop();
                if(j&0x80)

                PORTFbits.RF7=1;   //        SI=1;

                else PORTFbits.RF7=0;   //        else SI=0;
                j=j<<1;

                PORTFbits.RF4=1;   //        SCK=1;
                Nop();
                Nop();

                PORTFbits.RF4=0;   //        SCK=0;
        }
        for(i=0;i<23;i++)              //24位地址10;
        {
                Nop();
                Nop();
                if(k&0x800000)

                PORTFbits.RF7=1;    //        SI=1;

                else PORTFbits.RF7=0;    //        else SI=0;
                k=k<<1;       

                PORTFbits.RF4=1;   //        SCK=1;
                Nop();
                Nop();

                PORTFbits.RF4=0;    //        SCK=0;
        }
       
        for(i=0;i<8;i++)          //发数据1
        {
                Nop();
                Nop();
                if(l&0x80)

                PORTFbits.RF7=1;   //SI=1;
       
                PORTFbits.RF7=0;   //        else SI=0;
            l=l<<1;

                PORTFbits.RF4=1;   //        SCK=1;
                Nop();
                Nop();

                PORTFbits.RF4=0;    //SCK=0;
        }
       

        PORTAbits.RA4=1;    //        CE=1;
}



int spi_read()      //读操作
{
         
        int i,j;
        int data=0;
        i=0x03;
        j=0x10;

        PORTAbits.RA4=1;   //        CE=1;

        PORTFbits.RF4=0;    //         SCK=0;
        Nop();

        PORTAbits.RA4=0;    //        CE=0;
        Nop();
        Nop();
        for(i=0;i<8;i++)        
        {
                Nop();
                Nop();
                if(i&0x80)

                PORTFbits.RF7=1;  //SI=1;

                else PORTFbits.RF7=0;   //        else SI=0;
                i=i<<1;

                PORTFbits.RF4=1;   //SCK=1;
                Nop();
                Nop();

                PORTFbits.RF4=0;   //SCK=0;
        }
               
               

        for(i=0;i<23;i++)       //发送地址
        {
                Nop();
                Nop();
                if(j&0x800000)

                PORTFbits.RF7=1;     //SI=1;

                else PORTFbits.RF7=0;   //else SI=0;
                j=j<<1;

                PORTFbits.RF4=1;      //SCK=1;
                Nop();
                Nop();

        }

    for(i=0;i<8;i++)
        {
       
                PORTFbits.RF4=0;      //SCK=0;
                if(PORTAbits.RA10==1)
                   data=data+(2^(7-i));
                Nop();
                Nop();
       
                PORTFbits.RF4=1;   //                SCK=1;
                Nop();
                Nop();
        }

  return data;  

}
void RP_UART()
{
        RPINR18bits.U1RXR=8;
        RPOR4bits.RP9R=3;
}



void U1TX_INIT()
{
        IEC0bits.U1TXIE=0;
        IFS0bits.U1TXIF=0;
        U1BRG=0x19;
    U1MODEbits.PDSEL1=0;
    U1MODEbits.PDSEL0=0;
    U1MODEbits.STSEL=0;
    IEC0bits.U1TXIE=1;
        IPC3bits.U1TXIP2=1;
        IPC3bits.U1TXIP1=0;
        IPC3bits.U1TXIP0=0;
    U1STAbits.UTXISEL1=0;
    U1STAbits.UTXISEL0=0;
    U1MODEbits.UARTEN=1;
    U1STAbits.UTXEN=1;
        IEC0bits.U1TXIE=1;
}


void main(void)
{   
                int read_data;
    RP_UART();
        U1TX_INIT();

Nop();
Nop();
Nop();
Nop();
Nop();
spi_writeen();
spi_write();
spi_read();
        read_data=spi_read();

       
                U1TXREG=read_data;

       
    Nop();
        Nop();
       
        U1TXREG=0x34;

      Nop();
while(1);       

}

void _ISR _U1TXInterrupt(void)
{
IFS0bits.U1TXIF=0;
}
void _ISR _U1RXInterrupt(void)
{
IFS0bits.U1RXIF=0;

}

       
               
       
       
               
       
       
       
       

一周热门 更多>