TI中文支持网
TI专业的中文技术问题搜集分享网站

我用引脚模拟SPI操作TLC5615,我想显示一个正弦波的半波可是要么出来5伏的直流,要么就是0

#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdarg.h>
#include <math.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "driverlib/adc.h"
#include "driverlib/pwm.h"
#include "utils/uartstdio.h"

#define PI 3.1415926535897932384626433832795028841971

unsigned int tab[1000];

void tab_calc(unsigned int tab[])
{
int i;
for(i = 0;i < 1000;i++)
{
tab[i] = (unsigned int)(1023*sin((i+1)*PI/1000)+0.5);
}
}

void SPI_INPUT(unsigned int GPIO_BASEDATA,unsigned int GPIO_PINDATA,
unsigned int GPIO_BASECLK,unsigned int GPIO_PINCLK,
unsigned int GPIO_CS,unsigned int GPIO_PINCS,
unsigned int DATA)
{
int i;
//GPIOPinWrite(GPIO_CS,GPIO_PINCS,GPIO_PINCS);
GPIOPinWrite(GPIO_BASEDATA,GPIO_PINDATA,0);
GPIOPinWrite(GPIO_BASECLK,GPIO_PINCLK,0);

SysCtlDelay(100);
GPIOPinWrite(GPIO_CS,GPIO_PINCS,0);

for(i = 0;i < 4;i++)
{
SysCtlDelay(100);
GPIOPinWrite(GPIO_BASEDATA,GPIO_PINDATA,0);
SysCtlDelay(100);
GPIOPinWrite(GPIO_BASECLK,GPIO_PINCLK,GPIO_PINCLK);
SysCtlDelay(100);
GPIOPinWrite(GPIO_BASECLK,GPIO_PINCLK,0);
}
DATA &= 0x03FF;
for(i = 0;i < 10;i++)
{
//SysCtlDelay(300);
if(DATA & (0x200>>i))
GPIOPinWrite(GPIO_BASEDATA,GPIO_PINDATA,GPIO_PINDATA);
else
GPIOPinWrite(GPIO_BASEDATA,GPIO_PINDATA,0);

SysCtlDelay(100);
GPIOPinWrite(GPIO_BASECLK,GPIO_PINCLK,GPIO_PINCLK);
SysCtlDelay(100);
GPIOPinWrite(GPIO_BASECLK,GPIO_PINCLK,0);
}

for(i = 0;i < 2;i++)
{
//SysCtlDelay(300);
GPIOPinWrite(GPIO_BASEDATA,GPIO_PINDATA,GPIO_PINDATA);

SysCtlDelay(100);
GPIOPinWrite(GPIO_BASECLK,GPIO_PINCLK,GPIO_PINCLK);
SysCtlDelay(100);
GPIOPinWrite(GPIO_BASECLK,GPIO_PINCLK,0);
}

GPIOPinWrite(GPIO_BASEDATA,GPIO_PINDATA,0);

//GPIOPinWrite(GPIO_CS,GPIO_PINCS,GPIO_PINCS);
}

void main()
{
int i;
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
//SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,GPIO_PIN_7|GPIO_PIN_6);
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0);
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_3,GPIO_PIN_3);
tab_calc(tab);
while(1)
{
for(i = 0;i<1000;i++)
{
SPI_INPUT(GPIO_PORTD_BASE,GPIO_PIN_7,GPIO_PORTD_BASE,
GPIO_PIN_6,GPIO_PORTA_BASE,GPIO_PIN_4,tab[i]);
}
}

}

Michael Sun:

tlc6515是个SPI接口的DAC吗?

楼主可以先把SPI调通,然后尝试通过SPI读写tlc6515的寄存器,看是否正常。

这一步过去后,再去操作tlc6515的控制寄存器,给数字量产生模拟电平。

X tank:

回复 Michael Sun:

是5615芯片,不用操作寄存器,直接发数据就好了

Michael Sun:

回复 X tank:

为啥不用硬件SPI?M4有4个SPI呢。

量一下波形吧。时钟极性方面,看起来这个芯片要求CLK在CS变低之前是低电平,然后在CS变低后,CLK的第一个沿采样数据。

X tank:

回复 Michael Sun:

没在tivaware的PDF文件中看到SPI的描述啊,只看到SSI

X tank:

回复 Michael Sun:

哪个PDF里面介绍的是有QuadSPI,那个是不是一样的啊??能不能给个示例代码啊

Michael Sun:

回复 X tank:

QuadSPI是TM4C129x支持的模式,也向下兼容SPI。

例程在TivaWare的路径:C:\ti\TivaWare_C_Series-2.1.0.12573\examples\peripherals\ssi

xyz549040622:

我首先偏向于你DAC的硬件问题,你上电路图

X tank:

回复 xyz549040622:

赞(0)
未经允许不得转载:TI中文支持网 » 我用引脚模拟SPI操作TLC5615,我想显示一个正弦波的半波可是要么出来5伏的直流,要么就是0
分享到: 更多 (0)