1

マイクロコントローラーatmega32と通信するために、SCBTS-7500のi2cインターフェースを使用しようとしています。twiclockfrequencyを構成したいので、そのためにECONACAVIUMネットワークアクセスプロセッサを構成する必要があります。Cのコードで2クロック周波数のレジスタを構成できません。i2ctemp.cimという名前のプログラムを使用して支援しています。

これは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(unsigned)] = bitratediv ;** }

ご協力ありがとうございました

これがECONACAVIUMとプログラム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)!

4

1 に答える 1

2

環境を説明していませんが、それがベア メタルであり、アドレス 0x24 にメモリ マップド レジスタを設定したい場合は、次のように簡単に実行できます。

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

ほとんどの人は次のようなマクロを定義します:

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

あなたが書くことができるように:

mmio(0x24) = bitratediv;

あなたの場合、そのレジスタの上位 8 ビットのみを設定したいので、次のようになります。

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

おそらくあなたが探しているものです。

于 2012-03-08T01:10:13.577 に答える