mirror of https://github.com/ARMmbed/mbed-os.git
Implement peripheral clock determination process to I2C driver
When making I2C communication freq, we used a fix value 33.3MHz as peripheral clock as below. pclk = 33333333 / (2 << count); But it is not dynamic when system clock is changed. So, implement peripheral clock determination process. Peripheral clock will be decided by RZ-A1H system clock mode.pull/747/head
parent
7290768dc6
commit
27a9f11f8e
|
@ -20,6 +20,8 @@
|
||||||
|
|
||||||
|
|
||||||
#include "riic_iodefine.h"
|
#include "riic_iodefine.h"
|
||||||
|
#include "RZ_A1_Init.h"
|
||||||
|
#include "MBRZA1H.h"
|
||||||
|
|
||||||
volatile struct st_riic *RIIC[] = RIIC_ADDRESS_LIST;
|
volatile struct st_riic *RIIC[] = RIIC_ADDRESS_LIST;
|
||||||
|
|
||||||
|
@ -202,11 +204,20 @@ void i2c_frequency(i2c_t *obj, int hz) {
|
||||||
int oldfreq = 0;
|
int oldfreq = 0;
|
||||||
int newfreq = 0;
|
int newfreq = 0;
|
||||||
uint32_t pclk;
|
uint32_t pclk;
|
||||||
|
uint32_t pclk_base;
|
||||||
uint32_t tmp_width;
|
uint32_t tmp_width;
|
||||||
uint32_t width = 0;
|
uint32_t width = 0;
|
||||||
uint8_t count;
|
uint8_t count;
|
||||||
uint8_t pclk_bit = 0;
|
uint8_t pclk_bit = 0;
|
||||||
|
|
||||||
|
/* set PCLK */
|
||||||
|
if (false == RZ_A1_IsClockMode0())
|
||||||
|
{
|
||||||
|
pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK;
|
||||||
|
} else {
|
||||||
|
pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK;
|
||||||
|
}
|
||||||
|
|
||||||
/* Min 10kHz, Max 400kHz */
|
/* Min 10kHz, Max 400kHz */
|
||||||
if (hz < 10000) {
|
if (hz < 10000) {
|
||||||
freq = 10000;
|
freq = 10000;
|
||||||
|
@ -218,7 +229,7 @@ void i2c_frequency(i2c_t *obj, int hz) {
|
||||||
|
|
||||||
for (count = 0; count < 7; count++) {
|
for (count = 0; count < 7; count++) {
|
||||||
// IIC phi = P0 phi / rate
|
// IIC phi = P0 phi / rate
|
||||||
pclk = 33333333 / (2 << count);
|
pclk = pclk_base / (2 << count);
|
||||||
// In case of "CLE = 1, NFE = 1, CKS != 000( IIC phi < P0 phi ), nf = 1"
|
// In case of "CLE = 1, NFE = 1, CKS != 000( IIC phi < P0 phi ), nf = 1"
|
||||||
// freq = 1 / {[( BRH + 2 + 1 ) + ( BRL + 2 + 1 )] / pclk }
|
// freq = 1 / {[( BRH + 2 + 1 ) + ( BRL + 2 + 1 )] / pclk }
|
||||||
// BRH is regarded as same value with BRL
|
// BRH is regarded as same value with BRL
|
||||||
|
|
Loading…
Reference in New Issue