工具/软件:Code Composer Studio
你好
我在使用 SSIDataGet ()和高级模式 SSI_ADV_MODE_READ_WRITE 时遇到问题,我尝试读取 FT800的制造商 ID,但我不知道为什么它需要多次发送读取函数,因为第一个值不正确。
我尝试使用另一个 GPIO (例如 PORTJ GPIO_PIN_2)作为 CS 而不是 FSS、但情况有所改善、但并非解决方案
FT800 ID 为0x7C、我得到以下值:
*** SSI_0和 UART_0完成***
数据8地址= 0x102400读取= 0x42
Dato8地址= 0x102400读取= 0x4a
数据8地址= 0x102400读取= 0x43
数据8地址= 0x102400读取= 0x42
Dato8地址= 0x102400读取= 0x4a
数据8地址= 0x102400读取= 0x43
数据8地址= 0x102400读取= 0x42
数据8地址= 0x102400读取= 0x7c
Dato8地址= 0x102400读取= 0x4a
数据8地址= 0x102400读取= 0x43
数据8地址= 0x102400读取= 0x7c
数据8地址= 0x102400读取= 0x7c
数据8地址= 0x102400读取= 0x7c
数据8地址= 0x102400读取= 0x7c
请帮助!
此致、
-Angel Nino
我共享代码。
SSI 配置 功能
void ConfigureSSI (void) { MAP_SysCtlPeripheralReset (SYSCTL_Periph_GPIOA); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_SSI0); MAP_GPIOPinConfigure (GPIO_PA2_SSI0CLK);//SCK MAP_GPIOPinConfigure (GPIO_PA3_SSI0FSS);/CS MAP_GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);//Tx (MOSI) MAP_GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);//RX (MISO) MAP_GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); MAP_SSIConfigSetExpClk (SSI0_BASE、120000000、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、8000000、 8); MAP_SSIAdvModeSet (SSI0_BASE、SSI_ADV_MODE_READ_WRITE); MAP_SSIAdvFrameHoldEnable (SSI0_BASE); MAP_SSIEnable (SSI0_BASE); }
写入和读取函数
void ft800cmd_Write (unsigned char ftCommand) { // GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_CS、0);//将芯片选择设置为低 电平// while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx)); SSIDataPut (SSI0_BASE、ftCommand);//发送命令 SSIDataPut (SSI0_BASE、0x00);//发送第一个填充字节 SSIAdvDataPutFrameEnd (SSI0_BASE、0x00); //发送第二个填充字节 // while (SSIBusy (SSI0_BASE)); // GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_CS、GPIO_PIN_CS);//将芯片选择设置为高 电平} unsigned char ft800mem_Read8 (unsigned long ftAddress) { unsigned char ftData8 = 0;//读取8位的占位符 unsigned char cTempAddr[3];// FT800内存地址 unsigned char cZeroFill =零; cTempAddr[2]=(char)(ftAddress >> 16)| MEM_READ;//编写要发送的命令和地址 cTempAddr[1]=(字符)(ftAddress >> 8);//中间字节 cTempAddr[0]=(char)(ftAddress);//低字节 // GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_CS、0);//将芯片选择设置为低 电平// while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx)); SSIDataPut (SSI0_BASE、cTempAddr[2]);//发送内存写入加高地址字节 SSIDataPut (SSI0_BASE、cTempAddr[1]); SSIDataPut (SSI0_BASE、cTempAddr[0]); SSIAdvDataPutFrameEnd (SSI0_BASE、cZeroFill);//发送虚拟字节 SSIDataGet (SSI0_BASE、&ftData8);//接收数据字节 // while (SSIBusy (SSI0_BASE)); // GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_CS、GPIO_PIN_CS);//设置芯片选择高 返回 ftData8;//返回8位 } unsigned int ft800mem_Read16 (unsigned long ftAddress) { unsigned int ftData16=0;// 16位返回 unsigned char cTempAddr[3];// FT800内存地址 unsigned char cTempData[2];//读取16位的占位符 unsigned char cZeroFill =零; cTempAddr[2]=(char)(ftAddress >> 16)| MEM_READ;//编写要发送的命令和地址 cTempAddr[1]=(字符)(ftAddress >> 8);//中间字节 cTempAddr[0]=(char)(ftAddress);//低字节 // GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_CS、0);//将芯片选择设置为低 电平// while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx)); SSIDataPut (SSI0_BASE、cTempAddr[2]);//发送内存写入加高地址字节 SSIDataPut (SSI0_BASE、cTempAddr[1]); SSIDataPut (SSI0_BASE、cTempAddr[0]); SSIAdvDataPutFrameEnd (SSI0_BASE、cZeroFill); //发送虚拟字节 SSIDataGet (SSI0_BASE、&cTempData[0]);//接收数据字节 SSIDataGet (SSI0_BASE、&cTempData[1]); // while (SSIBusy (SSI0_BASE)); // GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_CS、 GPIO_PIN_CS);//将芯片选择设置为高电平 ftData16 =(cTempData[1]<< 8)|//编写要返回的值-高字节 (cTempData[0]);//低字节 返回 ftData16;//返回16位 }
主函数
int main (void) { int value; unsigned char ft800Gpio; MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ); GPIOPinTypeGPIOInput (GPIO_PORTJ_BASE、GPIO_PIN_0 | GPIO_PIN_1); GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU); SW_1和 PULL_UP 的//使能引脚 GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_1、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU); SW_1和 PULL_UP 的//使能引脚 SysCtlPeripheralEnable (SYSCTL_Periph_GPION); GPIOPinTypeGPIOInput (GPIO_PORTN_BASE、GPIO_PIN_INT); GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_PD | GPIO_PIN_CS | GPIO_PIN_1 | GPIO_PIN_0);//为 LED_2和 LED_1启用 ine ConfigureSSI(); ConfigureUART(); UARTprintf ("*** SSI_0和 UART_0完成***\n"\}); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_PD、GPIO_PIN_PD); // PD_N 的初始状态-高电平 GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_CS、GPIO_PIN_CS); // SPI CS 的初始状态-高电平 MAP_SysCtlDelay ((120000000 * 0.02)/ 3);//延迟20ms ft800cmd_Write (FT800_active); //启动 FT800 while (1) { if ((GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0)& GPIO_PIN_0)=0) { SysCtlDelay ((120000000 * 0.15)/3); 如果(值==0) { unsigned char data8 = ft800mem_Read8 (REG_ID);// REG_GPIO、REG_GPIO_DIR、REG_ID、ROM_CHIPID UARTprintf ("Dato8 Addr= 0x%x\tetch=0x%x\n"、REG_ID、dato8); 值= 1; } } 否则、如果((GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_1)& GPIO_PIN_1)= 0) { SysCtlDelay ((120000000 * 0.15)/3); 如果(值==0) { unsigned int data16 = ft800mem_Read16 (REG_Rplay_FREQ);// REG_CMD_READ、REG_CMD_WRITE UARTprintf ("Dato16 Addr= 0x%x\tetch=0x%x\n"、REG_REPLAY_FREQ、dato16); 值= 1; } } 其他 { 值= 0; } }