HI,
I am using ti-sdk-am3517-evm-05.05.00.00 with custom am3505 board.
My custom board connected with ADS8386(ADC) via SPI interface. (SPI0, CS0)
Here is ADS8386 ADC read cycle.
Writing SPI is OK, Reading SPI is Fail, Here is OSC picture.
==> Up: SCLK signal, Down: SIMO signal
==> Up: SCLK signal, Down: SIMO signal
OSC data seems right, But read data is 0. (Need only second byte. 0x08)
Here are inserted code. (Added code is blue)
1. Kernel - arch/arm/mach-ompa2/board-am3517evm.c
static struct omap_board_mux board_mux[] __initdata = {
...
OMAP3_MUX(SYS_NRESWARM, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP),
OMAP3_MUX(MCSPI1_CLK, OMAP_MUX_MODE0),
OMAP3_MUX(MCSPI1_SIMO, OMAP_MUX_MODE0),
OMAP3_MUX(MCSPI1_SOMI, OMAP_MUX_MODE0|OMAP_PIN_INPUT),
OMAP3_MUX(MCSPI1_CS0, OMAP_MUX_MODE0),
{ .reg_offset = OMAP_MUX_TERMINATOR },
...
static struct omap2_mcspi_device_config ads8638_mcspi_config = {
.turbo_mode= 0,
.single_channel= 1,/* 0: slave, 1: master */
};
static struct spi_board_info ads8638_spi_board_info[] __initdata = {
{
.modalias= "spidev",
.bus_num= 1,
.chip_select= 0,
.max_speed_hz= 10000000,
.controller_data= &ads8638_mcspi_config,
.mode= SPI_MODE_0,
},
};
spi_register_board_info(ads8638_spi_board_info,ARRAY_SIZE(ads8638_spi_board_info));
2. Kernel - driver/spi/omap2_mcspi.c
void dump_mcspi_reg(struct spi_device *spi)
{
struct omap2_mcspi_cs*cs = spi->controller_state;
void __iomem*base = cs->base;
int i=0;
for(i=0; i<12; i++)
{
base = cs->base + (i*4) + OMAP2_MCSPI_SYSCONFIG;
printk("0x%02x ==> 0x%08x\r\n", (i*4)+OMAP2_MCSPI_SYSCONFIG,
__raw_readl(base));
}
printk("\r\n");
}
static unsigned omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
{
...
l = mcspi_cached_chconf0(spi);
dump_mcspi_reg(spi);
tx_reg= base + OMAP2_MCSPI_TX0;
...
} else if (word_len <= 16) {
...
*rx++ = __raw_readl(rx_reg);
dump_mcspi_reg(spi);
dev_vdbg(&spi->dev, "read-%d %04x\n",word_len, *(rx - 1));
}
} while (c);
} else if (word_len <= 32) {
...
}
3. Application code
static const char *device = "/dev/spidev1.0";
static uint8_t mode = 0;
static uint8_t bits = 16;
static uint32_t speed = 10000000;
static uint16_t delay=0;
static void transfer(int fd)
{
int ret;
uint16_t tx[] = {0x0d00,};
uint8_t rx[ARRAY_SIZE(tx)] = {0, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
//.len = ARRAY_SIZE(tx),
.len = 2,
.delay_usecs = delay,
.speed_hz = 0,
.bits_per_word = 0,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret == 1)
pabort("can't send spi message");
printf("%04x ", rx[0]);
printf("ret: %d\n", ret);
}
int main(int argc, char *argv[])
{
int fd;
fd = open(device, O_RDWR);
transfer(fd);
close(fd);
}
4. Result
[ 984.034454] 0x10 ==> 0x00000015 //MCSPI_SYSCONFIG
[ 984.037841] 0x14 ==> 0x00000001 //MCSPI_SYSSTATUS
[ 984.041473] 0x18 ==> 0x00000001 //MCSPI_IRQSTATUS
[ 984.044860] 0x1c ==> 0x00000000 //MCSPI_IRQENABLE
[ 984.048309] 0x20 ==> 0x00000001 //MCSPI_WAKEUPENABLE
[ 984.051696] 0x24 ==> 0x00000000 //MCSPI_SYST
[ 984.055389] 0x28 ==> 0x00000001 //MCSPI_MODULCTRL
[ 984.058776] 0x2c ==> 0x001107cc //MCSPI_CHxCONF
[ 984.062225] 0x30 ==> 0x00000002 //MCSPI_CHxSTAT
[ 984.065612] 0x34 ==> 0x00000001 //MCSPI_CHxCTRL
[ 984.069000] 0x38 ==> 0x00000000 //MCSPI_TXx
[ 984.072448] 0x3c ==> 0x00000000 //MCSPI_RXx
[ 984.075805]
[ 984.080291] 0x10 ==> 0x00000015
[ 984.083679] 0x14 ==> 0x00000001
[ 984.087127] 0x18 ==> 0x00000007
[ 984.090484] 0x1c ==> 0x00000000
[ 984.093933] 0x20 ==> 0x00000001
[ 984.097320] 0x24 ==> 0x00000000
[ 984.100708] 0x28 ==> 0x00000001
[ 984.104125] 0x2c ==> 0x001107cc
[ 984.107513] 0x30 ==> 0x00000006
[ 984.110961] 0x34 ==> 0x00000001
[ 984.114349] 0x38 ==> 0x00000d00
[ 984.117767] 0x3c ==> 0x0d000000 // ???
[ 984.121154]
0000 ret: 2 // ???
OSC showed second byte is 0x08.(SOMI)
How to read valid data ?