TI技术支持:
您好!
我在AM335x_ICE_V2开发板上欲实现基于SYSBIOS的SPI1 channel0的SPI通讯。现在的问题是,时钟引脚、片选引脚都能正常输出,但数据输出引脚不能输出,只是被拉低。不知道什么原因。我的代码是在I2C_LED历程上修改的。代码如下:
/* * main.c * * Copyright (c) 2012 Texas Instruments Incorporated ALL RIGHTS RESERVED * */
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include "gpio.h"
#include "soc_AM335x.h"
#include "plat_utils.h"
#include "plat_mux.h"
#include "plat_led.h"
#include "osdrv_uart.h"
#include "osdrv_mmu.h"
#include "osdrv_version.h"
#include "plat_gpio.h"
#include "osdrv_oledlcd.h"
#include "osdrv_mcspi.h"
unsigned char uartInstance = 0;
unsigned char boardType = 3; //ICE v2
#define spi_Instance_1 1 //SPI1 be selected
#define spi_ClockDivider_1 96 //96 divider
#define spi_Dir_D0inD1out 0 //D1 input D0 output
#define spi_Channel_0 0 //Channel0 be selected
#define spi_Channel_1 1 //Channel0 be selected
unsigned char string[1]={'5'};
//Pin MUX CONTROL_MODULE REGISTERS OFFSET
#define PIN_MCASP0_ACLKX 0x0990
#define PIN_MCASP0_FSX 0x0994
#define PIN_MCASP0_AXR0 0x0998
#define PIN_MCASP0_AHCLKR 0x099c
#define PIN_XDMA_EVENT_INTR0 0x09b0
#define PIN_UART0_RTSN 0x096c
MUX_CONFIG icev2Mux[] = {
{ 0x0920 , 7 , AM335X_PIN_OUTPUT }, // mii1_txd2 -> LED_1
{ 0x091C , 7 , AM335X_PIN_OUTPUT }, // mii1_txd3 -> LED_2
{ 0x092C , 7 , AM335X_PIN_OUTPUT }, // MII1_TXCLK -> LED_3
{ 0x0880 , 7 , AM335X_PIN_OUTPUT }, // GPMC_CSN(1) -> LED_4
{ 0x09B0 , 7 , AM335X_PIN_OUTPUT }, // XDMA_EVENT_INTR(0) -> LED_5
{ 0x09B4 , 7 , AM335X_PIN_OUTPUT }, // XDMA_EVENT_INTR(1) -> LED_6
{ PIN_MCASP0_ACLKX , 3, AM335X_PIN_OUTPUT}, // PIN_SPI1_SCLK,mod3 (A13)
{ PIN_MCASP0_FSX , 3, AM335X_PIN_INPUT}, // PIN_SPI1_D0, INput mod3 (B13)
{ PIN_MCASP0_AXR0, 3, AM335X_PIN_OUTPUT_PULLUP }, //PIN_SPI1_D1,OUTput mod3
{ PIN_MCASP0_AHCLKR, 3, AM335X_PIN_OUTPUT}, // PIN_SPI1_CS0,mod3 (C12)
{ PIN_XDMA_EVENT_INTR0, 4, AM335X_PIN_OUTPUT_PULLUP}, // PIN_SPI1_CS1,mod3 (A15)
{ 0x0988 , 0 , AM335X_PIN_INPUT_PULLUP }, // I2C0_SCL
{ 0x098c , 0 , AM335X_PIN_INPUT_PULLUP }, // I2C0_SDA
{0xFFFFFFFF,0,0}
};
SYS_MMU_ENTRY applMmuEntries[] = {
{(void*)0x48300000,0}, //PWM - Non bufferable| Non Cacheable
{(void*)0x48200000,0}, //INTCPS,MPUSS - Non bufferable| Non Cacheable
{(void*)0x48100000,0}, //I2C2,McSPI1,UART3,UART4,UART5, GPIO2,GPIO3,MMC1 - Non bufferable| Non Cacheable
{(void*)0x48000000,0}, //UART1,UART2,I2C1,McSPI0,McASP0 CFG,McASP1 CFG,DMTIMER,GPIO1 -Non bufferable| Non Cacheable
{(void*)0x44E00000,0}, //Clock Module, PRM, GPIO0, UART0, I2C0, - Non bufferable| Non Cacheable
{(void*)0x4A300000,0}, //PRUSS1 - Non bufferable| Non Cacheable {(void*)0x49000000,0}, //EDMA3 - Non bufferable| Non Cacheable
{(void*)0x4A100000,0}, //CPSW - Non bufferable| Non Cacheable {(void*)0xFFFFFFFF,0xFFFFFFFF} };
/* * ======== taskFxn ======== */ Void taskFxn(UArg a0, UArg a1) {
unsigned char led_val = 0xff; // char t_str[8];
System_printf("enter taskFxn()\n");
LEDInit();
LEDDIGOUTSetVal(led_val);
Task_sleep(2000);
led_val = 0;
LEDDIGOUTSetVal(led_val);
Task_sleep(1000);
LEDGPIOSetVal(0,16 ,0);
LEDGPIOSetVal(0,17 ,0);
LEDGPIOSetVal(0,19 ,0);
LEDGPIOSetVal(0,20 ,0);
LEDGPIOSetVal(1,30 ,0);
LEDGPIOSetVal(3,9 ,0);
while(1) {
McSPIWrite(spi_Instance_1, string, 1, spi_Channel_0 );
int i=0;
for(i=0; i<655; i++);
}
/* * ======== main ======== */
Void main() {
Task_Handle task;
Error_Block eb;
MMUInit(applMmuEntries);
boardType = UTILsDetectBoardType();
Error_init(&eb);
task = Task_create(taskFxn, NULL, &eb);
if (task == NULL) {
System_printf("Task_create() failed!\n");
BIOS_exit(0);
}
uartInstance = 3;
PinMuxConfig(icev2Mux);
//SPI1,Channel0 initial
McSPIInit(spi_Instance_1, spi_ClockDivider_1, spi_Dir_D0inD1out, MCSPI_MULTI_CH, spi_Channel_0);
McSPIInit(spi_Instance_1, spi_ClockDivider_1, spi_Dir_D0inD1out, MCSPI_MULTI_CH, spi_Channel_1);
UartOpen(uartInstance,NULL); BIOS_start(); /* enable interrupts and start SYS/BIOS */
}
示波器的截图如下:绿色的是片选,黄色的是时钟,红色的是D1即信号输出线。
