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.

[参考译文] CCS/CC3200:SPI 不工作

Guru**** 1810550 points
Other Parts Discussed in Thread: ADS1247, CC3200, ADS1248
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/758696/ccs-cc3200-spi-is-not-working

器件型号:CC3200
主题中讨论的其他器件:ADS1247ADS1248

工具/软件:Code Composer Studio

您好!

我将 cc3200与 ads1247连接作为从设备。我在这里面临的问题是我无法从从从从设备获取数据。如果我使用 spidataput 和 spidataget、这些函数正常工作、这意味着它将在非从设备之后一直停留在该函数中 指令被执行。 而  SPIDataPutNonBlocking (GSPI_base、dat)的返回函数仅在第一次发送和剩余时间内获得1、而 SPIDataGetNonBlocking 函数的返回函数始终为零; 请在这方面帮助我


#include
#include "stdbool.h"
#include "stdint.h"
// Driverlib 包括
#include "rom.h"
#include "rom_map.h"
#include "hw_memmap.h"
#include "hw_common_reg.h"
#include "hw_types.h"
#include "hw_ints.h"
#include "UART.h"
#include "interrupt.h"
#include "pinmux.h"
#include "utils.h"
#include "prcm.h"
#include "pin.h"
#include "gpio.h"
#include "spi.h"

//通用接口包括
#include "UART_IF.h"
#include "IBP.h"

#define SPI_IF_bit_rate 1000000

void spiInit();
void IbpInit();
//void IBP_Initialize();
void send_data (unsigned char);
void receive_data (int);
//void receive_data1 (int);
bool IBP_self_test();

void main()

unsigned char ulUserData[4]="kll";
int i=0;
ClearTerm();
InitTerm();
spiInit();

IbpInit();
PinMuxConfig();
IBP_self_test();
消息("\t\t********* 主要***** \n\n");
MAP_UARTCharPut (UARTA0_BASE、'c');
for (i=0;i<5;i++)

MAP_UARTCharPut (UARTA0_BASE、ulUserData[i]);

消息("\t\t********* IBP 数据***** \n\n");
while (1)





空 IbpInit()

// PK2 =电源控制

MAP_PRCMPeripheralClkEnable (PRCM_GPIOA1、PRCM_RUN_MODE_CLK);
MAP_PinTypeGPIO (PIN_03、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA1_base、0x10、GPIO_DIR_MODE_OUT);

//PK4 =接地控制
MAP_PinTypeGPIO (PIN_04、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA1_base、0x20、GPIO_DIR_MODE_OUT);


// PN0 = SPI_EN
MAP_PRCMPeripheralClkEnable (PRCM_GPIOA0、PRCM_RUN_MODE_CLK);
MAP_PinTypeGPIO (PIN_60、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA0_BASE、0x20、GPIO_DIR_MODE_OUT);

// PN1 = MUX_EN
MAP_PinTypeGPIO (PIN_61、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA0_BASE、0x40、GPIO_DIR_MODE_OUT);
// PN2 MUX_SELA
MAP_PinTypeGPIO (PIN_62、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA0_BASE、0x80、GPIO_DIR_MODE_OUT);

// PN3 MUX_sELB
MAP_PinTypeGPIO (PIN_50、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA0_BASE、0x1、GPIO_DIR_MODE_OUT);


GPIOPinWrite (GPIOA1_base、GPIO_PIN_4、GPIO_PIN_4);//PK2=1
GPIOPinWrite (GPIOA1_base、GPIO_PIN_5、0);//PK4=1
GPIOPinWrite (GPIOA0_BASE、GPIO_PIN_5、GPIO_PIN_5);//PN0=1
GPIOPinWrite (GPIOA0_BASE、GPIO_PIN_6、GPIO_PIN_6);//PN1=1
GPIOPinWrite (GPIOA0_BASE、GPIO_PIN_7、0);//PN2=0 //多路复用器 SEP-A
GPIOPinWrite (GPIOA0_BASE、GPIO_PIN_0、0);//PN3=1 //多路复用器 SEP-b

GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_2);*/// PD2=芯片选择=低电平有效

// GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、0);//PD2=0 -根据数据表,步骤7

MAP_PRCMPeripheralClkEnable (PRCM_GPIOA2、PRCM_RUN_MODE_CLK);
MAP_PinTypeGPIO (PIN_08、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA2_base、0x2、GPIO_DIR_MODE_OUT);

GPIOPinWrite (GPIOA2_base、GPIO_PIN_1、0);


IBP_Initialize();//在 IBP.c 中
消息("\t\t***** IBPINIT ********* \n\n");

void spiInit()

MAP_PRCMPeripheralClkEnable (PRCM_GSPI、PRCM_RUN_MODE_CLK);

//为 SPI0 GSPI_CLK 配置 PIN_05
//
MAP_PinTypeSPI (PIN_05、PIN_MODE_7);

//
//为 SPI0 GSPI_MISO 配置 PIN_06
//
MAP_PinTypeSPI (PIN_06、PIN_MODE_7);

//
//为 SPI0 GSPI_MOSI 配置 PIN_07
//
MAP_PinTypeSPI (PIN_07、PIN_MODE_7);

//
//为 SPI0 GSPI_CS 配置 PIN_08
//
// map_PinTypeSPI (PIN_08、PIN_MODE_7);

SPIReset (GSPI_base);
//
//启用 SPI 进行通信
//
MAP_SPIEnable (GSPI_BASE);

// map_SPICSEnable (GSPI_base);
//
//配置 SPI 接口
//
MAP_SPIConfigSetExpClk (GSPI_base、MAP_PRCMPeripheralClockGet (PRCM_GSPI)、
SPI_IF_bit_rate、SPI_MODE_MASTER、SPI_SUB_MODE_1、
(SPI_SW_CTRL_CS |
SPI_3PIN_MODE |
SPI_Turbo_off |
// SPI_CS_ACTIVELOW|
SPI_WL_8));

消息("\t\t********* SPIINIT***** \n\n");



void IBP_Initialize()


unsigned long del=650000;
unsigned long Data0;
无符号长数据1;
unsigned long DataRx[NUM_SSI_DATA];
while (SPIDataGetNonBlocking (GSPI_base、&DataRx[0]))
{}

消息("\t\t********* IBPINITITALIZE***** \n\n");
 MAP_UtilsDelay (DEL);
 MAP_UtilsDelay (50000);
SEND_DATA (ADS1248_CMD_RESET);
MAP_UtilsDelay (50000);
消息("\t\t********* IBP A***** \n\n");
 SEND_DATA (ADS1248_CMD_SDATAC);
SEND_DATA (ADS1248_CMD_SELFOCAL);
Receive_data (1);
MAP_UtilsDelay (6500000);

SEND_DATA (ADS1248_CMD_WREG);//40h
SEND_DATA (ADS1248_3_SYS0);//03h
SEND_DATA (ADS1248_1_VBIAS);//01h
SEND_DATA (ADS1248_0_MUX0);//00h
SEND_DATA (ADS1248_2_MUX1);//03h
//SEND_DATA (ADS1248_14_GAIN);//42h ADS1248_14_SPS
SEND_DATA (ADS1248_15_SPS);//从5sps (以上)到1000sps 进行设置。 当前设置为160 (或某值) SPS。

Receive_data (8);

SEND_DATA (ADS1248_CMD_RREG);//20h
SEND_DATA (ADS1248_3_SYS0);//03h

Receive_data (2);

SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);

SEND_DATA (ADS1248_CMD_SYSGCAL);
Receive_data (1);
MAP_UtilsDelay (DEL);

//14 ---- 使用 WREG 命令(40h、03h、01h、00h、03h 和42h)写入相应的寄存器配置; --37页数据表
SEND_DATA (ADS1248_CMD_WREG);//40h
SEND_DATA (ADS1248_3_SYS0);//03h
SEND_DATA (ADS1248_1_VBIAS);//01h
SEND_DATA (ADS1248_0_MUX0);//00h
SEND_DATA (ADS1248_0_MUX0);//03h
SEND_DATA (ADS1248_15_SPS);//42h

Receive_data (6);

SEND_DATA (ADS1248_CMD_RREG);//20h
SEND_DATA (ADS1248_3_SYS0);
Receive_data (2);


SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);

SEND_DATA (ADS1248_CMD_SYNC);//05h
SEND_DATA (ADS1248_CMD_SYNC);//05h--- ////因为我们必须提供两次 SYNC 命令--pg 38
Receive_data (2);
MAP_UtilsDelay (DEL);
消息("\t\t********* 上次 IBP 初始化***** \n\n");

void send_data (unsigned char dat)

SPIDataPutNonBlocking (GSPI_base、dat);
消息("\t\t********* SENDDATA***** \n\n");

void receive_data (int n)


unsigned char ui32Index;
unsigned char 数据;
unsigned long pui32DataRx[10];
for (ui32Index = 0;ui32Index < n;ui32Index++)

//
//使用“阻塞”GET 函数接收数据。 此函数
//将等待接收 FIFO 中有数据后再返回。
//
DATA=SPIDataGetNonBlocking (GSPI_base、&pui32DataRx[ui32Index]);
//
//由于我们使用的是8位数据,所以屏蔽 MSB。
//
// pui32DataRx[ui32Index]&= 0x00FF;
报告("%x\n",data);
//
//显示 SSI0接收到的数据。
//
报告("%x\n"、pui32DataRx[ui32Index]);

消息("\t\t********* 接收数据***** \n\n");


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Chandana、

    您是否使用逻辑分析仪检查了从 CC3200传输到 ADS1248的 SPI 信号、以确保物理连接没有问题、并且您正在通过 SPI 信号发送正确的数据? 您可以尝试的另一项操作是在执行 MAP_SPIConfigSetExpClk()调用后将 MAP_SPIEnable (GSPI_base)调用移动到。

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Chandana、

    我假设您已经解决了您的问题、因为我没有听到您的反馈。 如果没有、请随时发布对此主题的响应、或打开有关此问题的新主题。

    此致、
    Michael