1、spi接口液晶屏调试问题:
①实际调试中,通过gpio模拟spi对oled屏进行写入后,oled屏可以正常显示字符及数字,验证代码的数据写入流程没问题;
② 利用spi接口实现同样的流程,发现没法正常显示,且逻辑分析仪抓取的数据与理论发送的数据也完全不同。对应的初始化及写spi操作部分的代码如下:
// 数据spi发送及接收代码
int SPIDataRW (unsigned char *tx_data, unsigned char *rx_data, int len)
{
int i = 0;
struct spi_ioc_transfer spi ;
memset (&spi, 0, sizeof (spi)) ;
spi.tx_buf = (unsigned long)tx_data ;
spi.rx_buf = (unsigned long)rx_data ;
spi.len = len ;
spi.delay_usecs = spiDelay ;
spi.speed_hz = spiSpeeds ;
spi.bits_per_word = spiBPW ;
return ioctl (spiFds, SPI_IOC_MESSAGE(1), &spi) ; //SPI_IOC_MESSAGE(1)
}
//初始化spi
int SPISetupMode (int speed, int mode, int bpw)
{
uint8_t lsb=0;
int fd;
if ((fd = open (spiDev0, O_RDWR)) < 0)
{
printf("Unable to open SPI device: %s\n", strerror (errno)) ;
return -1;
}
spiSpeeds = speed ;
spiFds = fd ;
/*
* Set Mode
*********************************************************************************
*/
if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0)
{
printf("Can't set spi mode: %s\n", strerror (errno)) ;
return -1;
}
/*
* set bits_per_word
*********************************************************************************
*/
if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0)
{
printf("Can't set bits per word: %s\n", strerror (errno)) ;
return -1;
}
/*
* set speed
*********************************************************************************
*/
if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0)
{
printf("Can't set max speed hz: %s\n", strerror (errno));
return -1;
}
/*设置LSB模式*/
if (ioctl(fd, SPI_IOC_WR_LSB_FIRST, &lsb) < 0) {
perror("SPI rd_lsb_fist");
return -1;
}
return fd ;
}
// 实际spi数据写入函数
void spi_write_cmd(uint8_t dat,uint8_t cmd)
{
int ret=0;
uint8_t dat_r=0, i;
ret = SPIDataRW(&dat, &dat_r, 1);
if(ret < 1)
perror("can't send spi message");
}
代码设置过程中是否有问题,另外能否提供spi传输的示例代码。
2、pwm接口调试问题:
在/sys/class/pwm目录下没有提供对pwm控制的主控节点(如:pwmchip0),因此不知道具体如何对pwm接口进行设置及数据发送。
能否提供对应的接口操作示例代码?
1、spi接口液晶屏调试问题:
①实际调试中,通过gpio模拟spi对oled屏进行写入后,oled屏可以正常显示字符及数字,验证代码的数据写入流程没问题;
② 利用spi接口实现同样的流程,发现没法正常显示,且逻辑分析仪抓取的数据与理论发送的数据也完全不同。对应的初始化及写spi操作部分的代码如下:
// 数据spi发送及接收代码
int SPIDataRW (unsigned char *tx_data, unsigned char *rx_data, int len)
{
int i = 0;
struct spi_ioc_transfer spi ;
memset (&spi, 0, sizeof (spi)) ;
spi.tx_buf = (unsigned long)tx_data ;
spi.rx_buf = (unsigned long)rx_data ;
spi.len = len ;
spi.delay_usecs = spiDelay ;
spi.speed_hz = spiSpeeds ;
spi.bits_per_word = spiBPW ;
return ioctl (spiFds, SPI_IOC_MESSAGE(1), &spi) ; //SPI_IOC_MESSAGE(1)
}
//初始化spi
int SPISetupMode (int speed, int mode, int bpw)
{
uint8_t lsb=0;
int fd;
if ((fd = open (spiDev0, O_RDWR)) < 0)
{
printf("Unable to open SPI device: %s\n", strerror (errno)) ;
return -1;
}
spiSpeeds = speed ;
spiFds = fd ;
/*
* Set Mode
*********************************************************************************
*/
if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0)
{
printf("Can't set spi mode: %s\n", strerror (errno)) ;
return -1;
}
/*
* set bits_per_word
*********************************************************************************
*/
if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0)
{
printf("Can't set bits per word: %s\n", strerror (errno)) ;
return -1;
}
/*
* set speed
*********************************************************************************
*/
if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0)
{
printf("Can't set max speed hz: %s\n", strerror (errno));
return -1;
}
/*设置LSB模式*/
if (ioctl(fd, SPI_IOC_WR_LSB_FIRST, &lsb) < 0) {
perror("SPI rd_lsb_fist");
return -1;
}
return fd ;
}
// 实际spi数据写入函数
void spi_write_cmd(uint8_t dat,uint8_t cmd)
{
int ret=0;
uint8_t dat_r=0, i;
ret = SPIDataRW(&dat, &dat_r, 1);
if(ret < 1)
perror("can't send spi message");
}
代码设置过程中是否有问题,另外能否提供spi传输的示例代码。
2、pwm接口调试问题:
在/sys/class/pwm目录下没有提供对pwm控制的主控节点(如:pwmchip0),因此不知道具体如何对pwm接口进行设置及数据发送。
能否提供对应的接口操作示例代码?