我正在尝试开发一个接口SPI,我已经从一个简单的配置开始。
问题是SCK似乎运行良好,但MOSI不工作。
这是我的代码和测试逻辑测试仪。

#include <stdlib.h>

#include <plib.h>

// example functions prototypes
int     SpiDoMasterSlaveExample(int nCycles);

void    SpiInitDevice(int chn, int isMaster, int frmEn, int frmMaster);


// some definitions

#define MIN_SPI_TXFER_SIZE      8       // min number of words per transfer
#define MAX_SPI_TXFER_SIZE      512     // max number of words per transfer


// configuration settings
#pragma config FNOSC = PRIPLL, POSCMOD = HS, FPLLMUL = MUL_18, FPLLIDIV = DIV_2, FPBDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FWDTEN = OFF

int main(void)
{

    SYSTEMConfigPerformance(72000000L);


    srand(ReadCoreTimer());     // seed the pseudo random generator

    if(!SpiDoMasterSlaveExample(100))
    {
        return 0;   // our example failed
    }

    return 1;

}

int SpiDoMasterSlaveExample(int nCycles)
{
    int fail=0;     // overall result

    SpiInitDevice(1, 1, 1, 1);  // initialize the SPI channel 1 as master, frame master
    SpiInitDevice(2, 0, 1, 0);  // initialize the SPI channel 2 as slave, frame slave

    while(nCycles-- && !fail)
    {
        unsigned int    txferSize;
        unsigned short* pTxBuff;
        unsigned short* pRxBuff;

        txferSize=MIN_SPI_TXFER_SIZE+rand()%(MAX_SPI_TXFER_SIZE-MIN_SPI_TXFER_SIZE+1);  // get a random transfer size

        pTxBuff=(unsigned short*)malloc(txferSize*sizeof(short));
        pRxBuff=(unsigned short*)malloc(txferSize*sizeof(short));       // we'll transfer 16 bits words

        if(pTxBuff && pRxBuff)
        {
            unsigned short* pSrc=pTxBuff;
            unsigned short* pDst=pRxBuff;
            int             ix;
            int             rdData;

            for(ix=0; ix<txferSize; ix++)
            {
                pTxBuff[ix]='A'; // fill buffer with some random data
            }

            ix=txferSize+1;             // transfer one extra word to give the slave the possibility to reply back the last sent word
            while(ix--)
            {
                SpiChnPutC(1, *pSrc++);     // send data on the master channel, SPI1
                rdData=SpiChnGetC(1);       // get the received data
                if(ix!=txferSize)
                {   // skip the first received character, it's garbage
                    *pDst++=rdData;         // store the received data
                }
                rdData=SpiChnGetC(2);           // receive data on the slave channel, SPI2
                SpiChnPutC(2, rdData);          // relay back data
            }

            // now let's check that the data was received ok
            pSrc=pTxBuff;
            pDst=pRxBuff;
            for(ix=0; ix<txferSize; ix++)
            {
                if(*pDst++!=*pSrc++)
                {
                    fail=1;     // data mismatch
                    break;
                }
            }
        }
        else
        {   // memory allocation failed
            fail=1;
        }

        free(pRxBuff);
        free(pTxBuff);  // free the allocated buffers
    }


    return !fail;
}

void SpiInitDevice(int chn, int isMaster, int frmEn, int frmMaster)
{
    unsigned int    config=SPI_CON_MODE16|SPI_CON_SMP|SPI_CON_ON;   // SPI configuration word
    if(isMaster)
    {
        config|=SPI_CON_MSTEN;
    }
    if(frmEn)
    {
        config|=SPI_CON_FRMEN;
        if(!frmMaster)
        {
            config|=SPI_CON_FRMSYNC;
        }
    }


    SpiChnOpen(chn, config, 4); // divide fpb by 4, configure the I/O ports. Not using SS in this example

}

抱歉,我无法发布我的信誉点的逻辑分析器图像。
我一直试图发送“A”(填充缓冲区传输)。这是向SPI1发送数据。
我正在从我的微芯片扩展板I/O读取SPI1,其中SPI1位于引脚41和43(41 SCK和43 SDO)中。
在SPI2,引脚23和25,显然我没有任何流量。
有人知道这个错误吗?
谢谢

最佳答案

PIC32MX系列具有一些外设(包括SPI)的可映射输入和输出管脚。这意味着,MOSI和MISO可以映射到不同的管脚,这取决于您的特定需求。
在开始使用SPI之前,需要在代码中指定这一点,否则PIC将不知道要使用哪个pin。
下面是如何设置管脚(外围管脚选择)的示例。你需要在图片的数据表中查找映射。调用中的第一个参数是数据表中的表索引。

/* inputs */
PPSInput(2, SDI1, RPF2);    // F2, MEMORY MISO -> SPI1SDI
PPSInput(2, SDI2, RPG7);    // G7, ZB MISO -> SPI2SDI

/* outputs */
PPSOutput(4, RPF3, SDO1);   // F3, MEMORY MOSI -> SPI1SDO
PPSOutput(1, RPG8, SDO2);   // G8, ZB MOSI -> SPI2SDO

08-26 17:58