Ядро AT91SAM7X256 у меня работало на частоте 48 МГц. Тип u8 определен как unsigned char. Микросхема MAX5437EUD работает совсем просто - байт, который в неё посылаем - а точнее, младшие 7 бит этого байта - определяют положение "движка" резистора (номинал у него кажется 50 кОм). Всего 128 позиций "движка", любую из которых мы можем задать, просто посылая байт подпрограммой SendByteMAX5437EUD.
//-------------------------------------------------------------------------
// Модуль MAX5437EUD.c
// Подпрограмма, посылающая байт резистору MAX5437EUD
//-------------------------------------------------------------------------
#include <pio/pio.h>
#include <intrinsics.h>
//выход - сигнал тактов для резистора контрастности LCD, ножка PB14, сигнал на схеме SCLK_R
#define PIN_SCLK_R {AT91C_PIO_PB14, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_1, PIO_DEFAULT}
//выход - сигнал данных для резистора контрастности LCD, ножка PB15, сигнал на схеме DIN_R
#define PIN_DIN_R {AT91C_PIO_PB15, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_1, PIO_DEFAULT}
//выход - сигнал выборки для резистора контрастности LCD, ножка PB17, сигнал на схеме CS_R
#define PIN_CS_R {AT91C_PIO_PB17, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_1, PIO_DEFAULT}
#define PINS_MAX5437 PIN_SCLK_R, PIN_DIN_R, PIN_CS_R
static const Pin sclkMAX5437 = PIN_SCLK_R;
static const Pin csMAX5437 = PIN_CS_R;
static const Pin dinMAX5437 = PIN_DIN_R;
static const Pin MAX5437_Pins[] = {PINS_MAX5437};
//задержка не потребовалась - быстродействия у MAX5437EUD хватило
//static void spiDelay (void)
//{
// __no_operation();
//}
void pinSetup (void)
{
//настраиваем ножки, которые управляют электронным резистором
PIO_Configure(MAX5437_Pins, PIO_LISTSIZE(MAX5437_Pins));
}
void SendByteMAX5437EUD (u8 byte)
{
u8 bitCnt;
byte &= 0x7F; //выделяем только 7 младших бит
PIO_Clear(&sclkMAX5437); //SCLK == 0
PIO_Clear(&csMAX5437); //CS == 0
// spiDelay();
// spiDelay();
// spiDelay();
for (bitCnt=8;bitCnt!=0;bitCnt--)
{
if (byte & 0x80)
PIO_Set(&dinMAX5437);
else
PIO_Clear(&dinMAX5437);
byte <<= 1;
// spiDelay();
// spiDelay();
// spiDelay();
PIO_Set (&sclkMAX5437); //SCLK==1
// spiDelay();
// spiDelay();
// spiDelay();
PIO_Clear(&sclkMAX5437); //SCLK==0
}
// spiDelay();
// spiDelay();
// spiDelay();
PIO_Set(&csMAX5437); //CS == 0
}
|