This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

我用引脚模拟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]);
}
}

}