Fix the bug that a noise will occur in SPI.

A noise will occur when execute frequency() after set the "mode" to 3 by format().
pull/835/head
Masao Hamanaka 2015-01-07 19:10:49 +09:00
parent b13b047a76
commit f119a368e5
1 changed files with 10 additions and 4 deletions

View File

@ -117,6 +117,7 @@ void spi_format(spi_t *obj, int bits, int mode, int slave) {
int phase = (mode & 0x1) ? 1 : 0; int phase = (mode & 0x1) ? 1 : 0;
uint16_t tmp = 0; uint16_t tmp = 0;
uint16_t mask = 0xf03; uint16_t mask = 0xf03;
uint16_t wk_spcmd0;
uint8_t splw; uint8_t splw;
switch (mode) { switch (mode) {
@ -154,8 +155,10 @@ void spi_format(spi_t *obj, int bits, int mode, int slave) {
obj->bits = bits; obj->bits = bits;
spi_disable(obj); spi_disable(obj);
obj->spi->SPCMD0 &= ~mask; wk_spcmd0 = obj->spi->SPCMD0;
obj->spi->SPCMD0 |= (mask & tmp); wk_spcmd0 &= ~mask;
wk_spcmd0 |= (mask & tmp);
obj->spi->SPCMD0 = wk_spcmd0;
obj->spi->SPDCR = splw; obj->spi->SPDCR = splw;
if (slave) { if (slave) {
obj->spi->SPCR &=~(1 << 3); // MSTR to 0 obj->spi->SPCR &=~(1 << 3); // MSTR to 0
@ -172,6 +175,7 @@ void spi_frequency(spi_t *obj, int hz) {
uint32_t hz_max; uint32_t hz_max;
uint32_t hz_min; uint32_t hz_min;
uint16_t mask = 0x000c; uint16_t mask = 0x000c;
uint16_t wk_spcmd0;
/* set PCLK */ /* set PCLK */
if (RZ_A1_IsClockMode0() == false) { if (RZ_A1_IsClockMode0() == false) {
@ -197,8 +201,10 @@ void spi_frequency(spi_t *obj, int hz) {
spi_disable(obj); spi_disable(obj);
obj->spi->SPBR = div; obj->spi->SPBR = div;
obj->spi->SPCMD0 &= ~mask; wk_spcmd0 = obj->spi->SPCMD0;
obj->spi->SPCMD0 |= (mask & brdv); wk_spcmd0 &= ~mask;
wk_spcmd0 |= (mask & brdv);
obj->spi->SPCMD0 = wk_spcmd0;
spi_enable(obj); spi_enable(obj);
} }