سلام به همگی
من قصد دارم از آی سی max6675 دما رو خونده و به میکرو ارسال کنم. دیتا خروجی این آی سی 16 بیتی هست که بیت های 3 تا 15 اطلاعات دما رو میده ( این آی سی از پروتوکل SPI پیروی میکنه). حالا مشکل اینجاست که رجیستر بافر SPI میکرو 8 بیتی هست و من دنبال راهی هستم که بتونم تمام 16 بیت رو دریافت کنم.
کد من:
لطفا راهنمایی کنید
من قصد دارم از آی سی max6675 دما رو خونده و به میکرو ارسال کنم. دیتا خروجی این آی سی 16 بیتی هست که بیت های 3 تا 15 اطلاعات دما رو میده ( این آی سی از پروتوکل SPI پیروی میکنه). حالا مشکل اینجاست که رجیستر بافر SPI میکرو 8 بیتی هست و من دنبال راهی هستم که بتونم تمام 16 بیت رو دریافت کنم.
کد من:
کد:
#define _XTAL_FREQ 4000000 #include <xc.h> #include "MAX6675_header.h" #include <stdbool.h> #include <string.h> volatile bool spi_rx_data_ready = false; void __interrupt() interrupt_isr(){ INTCONbits.GIE = 0; //Disable interrupt if(PIR2bits.BCLIF == 1){ //Checking to see if MSSP Bus Collision interrupt is triggered PIR2bits.BCLIF = 0; //Reseting flag } else if(PIR1bits.SSPIF){ //Checking to see if MSSP Interrupt is triggered spi_rx_data_ready = true; //A flag to indicate the data is received PIR1bits.SSPIF = 0; //Reseting flag } INTCONbits.GIE = 1; //Enable interrupt } void PORT_configuration(){ TRISB = 0x00; LATB = 0; TRISD = 0x00; LATD = 0; TRISCbits.TRISC3 = 0; //SCK as output TRISCbits.TRISC4 = 1; //SDI as input TRISCbits.TRISC5 = 0; //SDO as output TRISCbits.TRISC6 = 0; //SS as output LATCbits.LATC6 = 1; //SS is set to high to deselect slave } void SPI_Configuration(){ SSPCON1bits.SSPEN = 0; //Disabling serial port ANSELA = 0x00; //Setting different PORTS as digital I/O ANSELB = 0x00; ANSELD = 0x00; ANSELE = 0x00; SSPSTATbits.SMP = 1; //Input data sampled at end of data output time SSPSTATbits.CKE = 1; //Transmit occurs on transition from Idle to active clock state SSPCON1bits.CKP = 0; //Idle state for clock is a high level SSPCON1bits.SSPM = 0x00; //SPI Master mode, clock = FOSC/4 SSPCON1bits.SSPEN = 1; //Enabling serial port PIE1bits.SSPIE = 1; //MSSP Interrupt Enable bit PIE2bits.BCLIE = 1; //MSSP Bus Collision Interrupt Enable bit } void SPI_read(){ unsigned char Temp1=0,Temp2=0; LATCbits.LATC6 = 0; // __delay_us(0.1); //Wait for 100 nano seconds SSPBUF = 0x00; //Send dummy data to start communication while(spi_rx_data_ready == false); //Wait for the data to be completely received spi_rx_data_ready = false; //Reset the flag LATD = SSPBUF; SSPBUF = 0x00; //Send dummy data to start communication while(spi_rx_data_ready == false); //Wait for the data to be completely received spi_rx_data_ready = false; //Reset the flag LATB = SSPBUF; // LATD = Temp1; // LATB = Temp2; LATCbits.LATC6 = 1; __delay_ms(1000); //For better observation in PROTEUS (Remove for real_time application) } void main(void) { //Select 8MHz internal oscillator OSCCONbits.SCS = 0x03; //Internal oscillator block OSCCONbits.IRCF = 0x0d; //FOSC = 4MHz INTCONbits.GIE = 1; //To enable global interrupts INTCONbits.PEIE = 1; //To enable peripheral interrupts //Calling for configuration functions PORT_configuration(); SPI_Configuration(); while(1){ SPI_read(); } }
دیدگاه