Программирование интерфейса i2c в SBC на языке C - PullRequest
1 голос
/ 08 марта 2012

Я пытаюсь использовать интерфейс i2c SCB TS-7500, чтобы связать его с микроконтроллером atmega32.я хочу настроить twiclockfrequency, и для этого мне нужно настроить процессор доступа к сети ECONA CAVIUM.Я не могу настроить регистр частоты twiclock в коде на C. У меня есть программа с именем i2ctemp.c, я использую ее, чтобы помочь мне.

Это адрес TWI: reg = map_phys (0x71000020, & fd);и адрес часов 0x24;затем для TWI_CLKDIV биты 16: 8.

Я сделал что-то вроде этого:

void setbitrate (long bitrate) {

unsigned bitratediv;

//Calcule of twi clock divider value
//Formule is TwiCLockFreq = PCLK /(2*(TwiClockDivider +1))

  bitratediv = (unsigned)(PCLK/(2*bitrate)); //PCLK= 1M and bitrate= 50k

///If bitrate value is less than 16 then do:

if(bitratediv <= 16)
    bitratediv = bitrate -1 ;

//FINALLY assigned the value to the register of the TWICLOCK

reg[0x24/sizeof(unsigned)] = bitratediv;

* Я просто хочу знать, как получить этот регистр "0x24", потому что это не работает -------------------> reg [0x24 / sizeof (без знака)] = bitratediv;**}

Спасибо за вашу помощь

Вот руководство к ECONA CAVIUM и программе i2ctemp.c (ftp: // ftp.embeddedarm.com/ts-arm-sbc/ts-7558-linux/samples/i2ctemp.c)!(http://www.embeddedarm.com/documentation/third-party/ECONA-CNS21XX-HRM-v.1.8.pdf)!

1 Ответ

2 голосов
/ 08 марта 2012

Вы не описали свою среду, но если она пустая и вы хотите установить регистр отображения памяти по адресу 0x24, вы можете просто сделать:

*(volatile unsigned int *)0x24 = bitratediv;

Большинство людей определяют макрос примерно так:

#define mmio(reg) (*(volatile unsigned int *)(register))

Так что вы можете просто написать:

mmio(0x24) = bitratediv;

В вашем случае вы хотите установить только первые 8 бит этого регистра, что-то вроде:

mmio(0x24) = (mmio(0x24) & 0x00FF) | (bitratediv << 8);

это, вероятно, то, что вы ищете.

...