MCP23S17 no funciona

0

Lo siento por mi inglés roto por adelantado.

Estoy tratando de hacer que mi atsam4ls2b se comunique con un mcp23s17. Sin embargo, no puedo hacerlo funcionar. Estoy enviando lo que creo que son los datos correctos sobre el pin Mosi al mcp23s17, y al verificar los pines con un multímetro puedo ver que llega al mcp23s17. Sin embargo, parece que no hace nada con los datos. Espero que alguien pueda ayudarme con este problema. A continuación se muestra mi código que está en un bucle. debería configurar todos los pines de gpio para generar 3.3v, pero no genera nada.

SPICon->StartTransaction();
SPICon->Transceive(0x40);//select standard first 4 bits(0100) with opcode 000(A2-A1-A0)(opcode is not used for now) and R/W bit on Write (0) (0100-000-0)
SPICon->Transceive(0x0A);//select IO control register
SPICon->Transceive(0x38);//disable slew rate, sequential and enables address pins
SPICon->EndTransaction();

SPICon->StartTransaction();
SPICon->Transceive(0x40);//select standard first 4 bits(0100) with opcode 000(A2-A1-A0)(opcode is not used for now) and R/W bit on Write (0) (0100-000-0)
SPICon->Transceive(0x0B);//select IO control register
SPICon->Transceive(0x38);//disable slew rate, sequential and enables address pins
SPICon->EndTransaction();

SPICon->StartTransaction();
SPICon->Transceive(0x40);//select standard first 4 bits(0100) with opcode 000(A2-A1-A0)(opcode is not used for now) and R/W bit on Write (0) (0100-000-0)
SPICon->Transceive(0x00);//select IO direction register A
SPICon->Transceive(0x00);//set all pins to output
SPICon->EndTransaction();

SPICon->StartTransaction();
SPICon->Transceive(0x40);//select standard first 4 bits(0100) with opcode 000(A2-A1-A0)(opcode is not used for now) and R/W bit on Write (0) (0100-000-0)
SPICon->Transceive(0x01);//select IO direction register B
SPICon->Transceive(0x00);//set all pins to output
SPICon->EndTransaction();

SPICon->StartTransaction();
SPICon->Transceive(0x40);//select standard first 4 bits(0100) with opcode 000(A2-A1-A0)(opcode is not used for now) and R/W bit on Write (0) (0100-000-0)
SPICon->Transceive(0x14);//select Latch A
SPICon->Transceive(0xFF);//set pins to high
SPICon->EndTransaction();

SPICon->StartTransaction();
SPICon->Transceive(0x40);//select standard first 4 bits(0100) with opcode 000(A2-A1-A0)(opcode is not used for now) and R/W bit on Write (0) (0100-000-0)
SPICon->Transceive(0x15);//select Latch B
SPICon->Transceive(0xFF);//set pins to high
SPICon->EndTransaction();

donde la función transceptiva es:

uint8_t SoftwareSPI::Transceive(uint8_t DataOut)
{
    uint8_t DataIn = 0;

    for(int i = 0; i < 8; i++)
    {
        MoSiPin->SetValue((DataOut >> (7 - i) & 0x01) ? GpioValue::High : GpioValue::Low);
        ClockPin->SetValue(GpioValue::High);

        DelayUs(20);

        GpioValue MisoValue = MiSoPin->GetValue();

        DataIn |= (((uint8_t)MisoValue) << (7 - i));
        ClockPin->SetValue(GpioValue::Low);

        DelayUs(20);
    }

    return DataIn;
}

que básicamente lo hace: establece el pin mosi en el valor del bit i en el byte DataOut - > configura el pin del reloj en alto - > demora para asegurarse de que los cambios se realicen - > ponga el valor del miso en el bit i del byte DataIn - > configura el pin del reloj a bajo - > demora de nuevo para asegurarte de que los cambios se cumplan

esto sucede 8x, por lo que pasa por todo el byte.

la StartTransaction y EndTransaction simplemente tiran del CS hacia abajo y hacia arriba.

los pines de dirección están todos conectados al suelo, el pin mosi está conectado al pinA22, el miso al pinA21, el reloj al pinA20, la selección de chips al pinB04, vdd y vss están conectados a 3.3V y tierra. todos los gpios están conectados a un led por ahora.

Estoy usando Atmel Studio 7 como compilador. el programa utiliza algunas bibliotecas personalizadas que se han probado correctamente.

¿Alguien puede ver lo que está mal aquí?

Gracias de antemano.

    
pregunta user199409

1 respuesta

1

aparentemente tuve que conectar el pin nReset a 3.3V también, que no estaba conectado antes. después de conectar el pin, todo funciona perfectamente, gracias por las respuestas rápidas: D

    
respondido por el user199409

Lea otras preguntas en las etiquetas