找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 519|回复: 0
打印 上一主题 下一主题
收起左侧

23LC1024 SRAM 综合测试(BASCOM-AVR版)

[复制链接]
跳转到指定楼层
楼主


程序:
rem Main.bas file generated by New Project wizard
rem
rem Created:   周日 10月 5 2025
rem Processor: ATmega16
rem Compiler:  BASCOM-AVR

rem 23LC1024 SRAM 综合测试(BASCOM-AVR版)

$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64

' 引脚定义
'如果不配置Noss = 1就不能使用硬件spi的ss管脚Portb.2!!!!这时须选择其他端口管脚单独配置如PortD.2。
'或者加实物上拉电阻可取消Portb.2 = 1
'Config PinD.2 = Output
'PortD.2 = 1
Cs Alias Portb.4

' SPI 配置
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1
Spiinit

' 变量定义
Dim Write_byte As Byte , Read_byte As Byte
Dim Temp As Byte
Dim i As Byte , j As Byte
Dim Test_data As Byte
Dim Addr As Long
Dim Error_count As Word
Dim Addr_high As Byte
Dim Addr_mid As Byte
Dim Addr_low As Byte
Dim Pass_count As Word

' 串口配置
'Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 8
$baud = 9600
' 声明子程序
Declare Sub Spi_write()
Declare Sub Spi_read()
Declare Sub Test_single_address()
Declare Sub Test_multiple_addresses()
Declare Sub Test_sequential_addresses()
Declare Sub Test_boundary_addresses()
Declare Sub Test_data_patterns()

' 主程序
Print
Print "   ========================================"
Print "        23LC1024 SRAM 综合测试"
Print "   ========================================"
Print

Waitms 1000

' 运行各种测试
Call Test_single_address
Call Test_multiple_addresses
Call Test_sequential_addresses
Call Test_boundary_addresses
Call Test_data_patterns

Print
Print "   ========================================"
Print "   所有测试已完成!"
Print "   ========================================"

Do
   ' 主循环
Loop
End

' SPIWrite子程序
Sub Spi_write()
   Addr_high = Addr / 65536
   Addr_mid = Addr / 256
   Addr_low = Addr And &HFF

   Reset Cs
   Temp = &H02 : Spiout Temp , 1                    ' WRITE命令
   Spiout Addr_high , 1                             ' 地址高字节
   Spiout Addr_mid , 1                              ' 地址中字节
   Spiout Addr_low , 1                              ' 地址低字节
   Spiout Write_byte , 1                            ' 数据
   Set Cs
   Waitms 5                                         ' Write周期等待
End Sub

' SPI读子程序
Sub Spi_read()
   Addr_high = Addr / 65536
   Addr_mid = Addr / 256
   Addr_low = Addr And &HFF

   Reset Cs
   Temp = &H03 : Spiout Temp , 1                    ' READ命令
   Spiout Addr_high , 1                             ' 地址高字节
   Spiout Addr_mid , 1                              ' 地址中字节
   Spiout Addr_low , 1                              ' 地址低字节
   Spiin Read_byte , 1                              ' 读取数据
   Set Cs
End Sub

' 测试1: 单地址基本功能
Sub Test_single_address()
   Print "   测试 1:单地址基本功能"
   Print "   ----------------------------------------"

   Addr = &H1234
   Write_byte = &HA5

   Call Spi_write
   Call Spi_read

   Print "   Address: 0x" ; Hex(addr) ; "  Write: 0x" ; Hex(write_byte) ; "  Read: 0x" ; Hex(read_byte)

   If Write_byte = Read_byte Then
      Print "   >>> 单地址测试:通过"
   Else
      Print "   >>> 单一地址测试:失败"
   End If
   Print
End Sub

' 测试2: 多地址测试
Sub Test_multiple_addresses()
   Print "   测试 2:多地址测试"
   Print "----------------------------------------"

   Error_count = 0

   For i = 1 To 10
      Addr = i * &H1000                            ' 递增地址
      Write_byte = i * &H11                        ' 递增数据

      Call Spi_write
      Call Spi_read

      Print "   Addr: 0x" ; Hex(addr) ; "  Write: 0x" ; Hex(write_byte) ; "  Read: 0x" ; Hex(read_byte)

      If Write_byte <> Read_byte Then
         Incr Error_count
         Print "   *** 地址 0x 处出错" ; Hex(addr)
      End If
   Next i

   Pass_count = 10 - Error_count
   Print "   多个地址测试: " ;Pass_count ;"/10 通过"
   Print
End Sub

' 测试3: 连续地址测试
Sub Test_sequential_addresses()
   Print "   测试 3:连续地址测试"
   Print "   ----------------------------------------"

   Error_count = 0
   Addr = &H5000

   For i = 0 To 15
      Write_byte = &H40 + i                        ' 连续数据

      Call Spi_write
      Call Spi_read

      If Write_byte <> Read_byte Then
         Incr Error_count
         Print "   *** 在顺序地址处出现错误 " ; i
      End If
      Addr = Addr + 1
Print  "   Addr: 0x" ; Hex(addr) ;"Write 0x" ; Hex(write_byte);" Read 0x" ;Hex(read_byte)
   Next i

   Pass_count = 16 - Error_count
   Print"   连续地址测试: " ;Pass_count ;"/16 通过"
   Print
End Sub

' 测试4: 边界地址测试
Sub Test_boundary_addresses()
   Print "   测试 4:边界地址测试"
   Print "   ----------------------------------------"

   Error_count = 0

   ' 测试边界地址
   Write_byte = &H5A

   ' 最低地址
   Addr = &H00000
   Call Spi_write
   Call Spi_read
   Print "   边界 0x" ; Hex(addr) ; " : Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count

   ' 第一页结束
   Addr = &H000FF
   Call Spi_write
   Call Spi_read
   Print "   边界 0x" ; Hex(addr) ; " : Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count

   ' 最后页开始
   Addr = &H1FF00
   Call Spi_write
   Call Spi_read
   Print "   边界 0x" ; Hex(addr) ; " : Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count

   ' 最高地址 (128KB)
   Addr = &H1FFFF
   Call Spi_write
   Call Spi_read
   Print "   边界 0x" ; Hex(addr) ; " : Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count

   Pass_count = 4 - Error_count
   Print "   边界地址测试: " ;Pass_count ;"/4 通过"
   Print
End Sub

' 测试5: 数据模式测试
Sub Test_data_patterns()
   Print "   测试 5:数据模式测试"
   Print "----------------------------------------"

   Error_count = 0
   Addr = &H8000

   ' 测试各种数据模式
   Write_byte = &H00                               ' 全0
   Call Spi_write : Call Spi_read
   Print "   模式 1:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count
   Addr = Addr + 1

   Write_byte = &HFF                               ' 全1
   Call Spi_write : Call Spi_read
   Print "   模式 2:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count
   Addr = Addr + 1

   Write_byte = &H55                               ' 01010101
   Call Spi_write : Call Spi_read
   Print "   模式 3:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count
   Addr = Addr + 1

   Write_byte = &HAA                               ' 10101010
   Call Spi_write : Call Spi_read
   Print "   模式 4:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count
   Addr = Addr + 1

   Write_byte = &H0F                               ' 00001111
   Call Spi_write : Call Spi_read
   Print "   模式 5:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count
   Addr = Addr + 1

   Write_byte = &HF0                               ' 11110000
   Call Spi_write : Call Spi_read
   Print "   模式 6:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count
   Addr = Addr + 1

   Write_byte = &H33                               ' 00110011
   Call Spi_write : Call Spi_read
   Print "   模式 7:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count
   Addr = Addr + 1

   Write_byte = &HCC                               ' 11001100
   Call Spi_write : Call Spi_read
   Print "   模式 8:Write 0x" ; Hex(write_byte) ; " Read 0x" ; Hex(read_byte)
   If Write_byte <> Read_byte Then Incr Error_count

   Pass_count = 8 - Error_count
   Print "   数据模式测试: " ;Pass_count ;"/8 通过"
   Print
End Sub

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表