1

我正在尝试使用 SCB TS-7500 的 i2c 接口将其与微控制器 atmega32 通信。我想配置 twiclockfrequency,为此我需要配置 ECONA CAVIUM 网络访问处理器。我无法在 C 代码中配置 twiclock 频率的寄存器。我有一个名为 i2ctemp.c 的程序,我用它来帮助我。

这是TWI的地址:reg = map_phys(0x71000020,&fd); 时钟地址为0x24;然后对于 TWI_CLKDIV 位 16:8。

我做了这样的事情:

无效设置比特率(长比特率){

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 ;** }

谢谢您的帮助

这是 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)!

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 回答