微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 在线急求大神,关于PIC16F1823单片机SPI的问题!

在线急求大神,关于PIC16F1823单片机SPI的问题!

时间:10-02 整理:3721RD 点击:
在线急求大神,关于PIC16F1823单片机SPI的问题,从机接收到命令后令I/O管脚变成高电平,但是又立马变成了低电平怎么回事?sum累加也是同样问题,但主机发送命令速度越快,清零的速度就越慢。从机代码如下:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
/*
*
*/
#include <htc.h>
__CONFIG(FOSC_INTOSC & WDTE_ON & PWRTE_ON & MCLRE_ON & CP_ON & CPD_ON & BOREN_ON & CLKOUTEN_OFF & IESO_ON & FCMEN_ON);
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF);
#define nop() asm("nop")
unsigned char RC_DATA;
volatile unsigned char sum;
void init_fosc(void)
{
   OSCCON = 0x78;//16MHz
//OSCCON = 0xF0;//32MHz
}
void init_SPI(void)
{
    TRISCbits.TRISC0=1;  // SCK input
    TRISCbits.TRISC1=1; //  SDI input
    TRISCbits.TRISC2=0; //  SDO output
    TRISCbits.TRISC3=1; //  SS input
    APFCONbits.SDOSEL = 0; // RC2 ? SDO ?
    APFCONbits.SSSEL = 0; // RC3 ? SS ?
    ANSELCbits.ANSC0 = 0; // ? I/O
    ANSELCbits.ANSC1 = 0; // ? I/O
    ANSELCbits.ANSC2 = 0; // ? I/O
    ANSELCbits.ANSC3 = 0; // ? I/O
    INTCONbits.PEIE = 1;
    INTCONbits.GIE  = 1;
    PIE1bits.SSP1IE = 1; //enables the SPI Receive interrupt

    SSP1STATbits.SMP = 0; //?
    SSP1STATbits.CKE = 1; // ?
    SSP1BUF =  0x00;
    SSP1CON1 = 0x34; // SSP1EN=1  CKP=1  SSPM 0100
    //SSP1CON3bits.BOEN = 0; // ? SSP1STAT ? BF ? 1 ? SSP1CON1 ? SSP1OV
                          //  ? 1 ?
     }

void spi_send_byte(unsigned int byte)
{
  SSP1BUF = byte;
  while(BF==0); //?
  SSP1IF = 0;
}

void SPI_send(void){
switch(RC_DATA)
        {
                case(0xA0):RA5=!RA5; RC_DATA = 0x00; break;             //Show Channel0
                case(0xA1):sum=sum+1;spi_send_byte(sum);RC_DATA = 0x00; break;             //Show Channel1
                case(0xA2):spi_send_byte(0x33);RC_DATA = 0x00; break;            //Show Channel2
                case(0xA3):spi_send_byte(0x44);RC_DATA = 0x00; break;            //Show Channel3
            default:                     break;   
           }
}

void interrupt isr(void)
{
     if(SSP1IE && SSP1IF)
    {
      RC_DATA = SSP1BUF;
      SSP1IF= 0;
      SSP1CON1bits.WCOL=0;
      SPI_send();  
    }
}  
/*
*
*/
int main(int argc, char** argv) {
    init_fosc();
    init_SPI();
      ANSELA=0;   //?RA
    TRISAbits.TRISA5=0;//?RA5?
     RA5=0;
     sum=0;
    while(1)
    {
        nop();
        }
}

clk应该是输出口

还有ss引脚应该也是输出楼吧

这个是从机。

你好,你还保留PIC16F1823单片机SPI程序的例程吗?我在网上找不到,如果方便的话能给我发一下吗?谢谢

谢谢,小编提供的场地。
MICROCHIP 原装正品,另有可替换单片机(无需修改PCB资料,程序可共用PIC的) 有用到的兄弟多多支持!  电话13430885511(微信同号),QQ2355910801

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top