#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: