Oroitz Elgezabal

MC9S12C128 - Question about MISO pin in SPI communication

Discussion created by Oroitz Elgezabal on Jul 17, 2007
Hi,

I'm using a MC9S12C128 with ICC12 compiler and I'm trying to communicate it with a MAX7317 I/O expander.

 I have succeed to write the I/O expander in order to change the state of the pins configured as outputs and also to read the state of the inputs. I can see with the oscilloscope that the device tell me when the input has changed.

My problem is that the MISO pin of the Microcontroller has a voltage of 4.86V and then when the MAX7317 sends something, the microcontroller receives always 0xFF in the SPIDR because even when the MAX7317 sends a logical NULL, the voltage received in the microcontroller is 3,8V.

The voltage supply of the MAX7317 is 3.3V. Can it be the problem?

That is something normal (that MISO pin has 5V)? Am I doing something wrong? Should I do something different appart from enabling the SPI module (I think it is right configured as the microcontroller communicates with the MAX7317)?

I attach the datasheet of the MAX7317 and I post my code. Thank you in advance.

Best regards
Oroitz Elgezabal

#include <mc9s12c128.h>
#include <datatypes.h>
#include <ofunc.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>


//Definition of the variables
UINT8 data, answer, BCD, bla;

//Definition of the functions
void WGPIO_spi(int data){
    while(!(SPISR & 0b00100000)); // wait until write is permissible
    SPIDR  = data; // output the byte to the SPI $00DD
}

UINT8 RGPIO_spi(void){
    while(!(SPISR & 0b10000000));  // wait until communication is complete
    return(SPIDR); // clear the SPIF flag.
}

void GPIO_on(){
     PORTA &= ~0x01; //$0000
}

void GPIO_off(){
     PORTA |= 0x01;
}

void init_SPI(){
    SPICR1 = 0x50; // SPICR1=0b01010100/0x54 $00D8
    SPICR2 = 0x00; //$00D9
       DDRM = 0x38; //set SS,SCK,MOSI lines of the µC to Output $0252
    PTM=0x00;
       SPIBR=0x43; //Bus clock:8MHz --> prescaler:80 --> SCK:100 KHz $00DA
    GPIO_off();
}

void main (void){
     bla=10;
    //Configuration of the chip select pin
    DDRA  = 0x01; // Port A, Pin 0 controls Shutdown of MAX7317

    //Configuration & initialization of the SPI module
    init_SPI();

    ledon(1);
    delay_ms(1000);
    ledoff(1);
   
    GPIO_on(); //Enable MAX7317 - /CS driven LOW
    delay_us(5);
    WGPIO_spi(0x0A); //Address of "Write ports P[0:9] with same output level"
    RGPIO_spi(); //Dummy read
    WGPIO_spi(0x01); //P[0:9] set as inputs
    delay_us(50);
    GPIO_off(); //Disable MAX7317 - /CS driven HIGH
   
    delay_ms(500);
   
    while(1) {
        GPIO_on(); // Drive /CS LOW
        delay_us(1);
        WGPIO_spi(0x8E); //Address of "Read input ports P[9:8]"
        RGPIO_spi(); //Dummy read
        WGPIO_spi(0x01); //Dummy byte sent (it will be ignored)
        delay_us(50);
        GPIO_off(); // Drive /CS HIGH
        ledon(1);
       
        delay_us(100);
       
        //Establish a new communication in order to get the desired data
        GPIO_on();
        delay_us(1);
        WGPIO_spi(0x03); //Address of P5
        RGPIO_spi(); //Dummy read
        WGPIO_spi(0x00); //P5 set as output
        data=RGPIO_spi(); //Get the value of the inputs
        delay_us(50);
        GPIO_off();
        ledoff(1);
        delay_ms(500);
    }
}

--
Alban Edit: FSL Part Number must figure in Message Subject line.



Message Edited by Alban on 2007-07-17 12:08 PM

 

MAX7317.pdf

Message Edited by t.dowe on 2009-10-21 12:16 AM

Outcomes